Index: gcc/match.pd =================================================================== --- gcc/match.pd (revision 236489) +++ gcc/match.pd (working copy) @@ -733,21 +733,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && tree_nop_conversion_p (type, TREE_TYPE (@2))) (if (single_use (@5) && single_use (@6)) (op @3 (convert @2)) (if (single_use (@3) && single_use (@4)) (op (convert @1) @5)))))) /* (X ^ Y) ^ (X ^ Z) -> Y ^ Z */ (simplify (bit_xor (convert1? (bit_xor:c @0 @1)) (convert2? (bit_xor:c @0 @2))) (if (tree_nop_conversion_p (type, TREE_TYPE (@1)) && tree_nop_conversion_p (type, TREE_TYPE (@2))) - (convert (bit_xor @1 @2)))) + (bit_xor (convert @1) (convert @2)))) (simplify (abs (abs@1 @0)) @1) (simplify (abs (negate @0)) (abs @0)) (simplify (abs tree_expr_nonnegative_p@0) @0) Index: gcc/testsuite/gcc.dg/tree-ssa/71206.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/71206.c (revision 0) +++ gcc/testsuite/gcc.dg/tree-ssa/71206.c (working copy) @@ -0,0 +1,8 @@ +/* { dg-do compile } */ +/* { dg-options "-O" } */ + +int f(int d, unsigned b) { + int i2 = b ^ 1; + int i4 = d ^ 1; + return i2 ^ i4; +}