diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc index 6c11654a2c6..b90ad8f0900 100644 --- a/gcc/gimple-fold.cc +++ b/gcc/gimple-fold.cc @@ -7572,7 +7572,7 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT *pbitsize, /* Not much we can do when xor appears in the right-hand compare operand. */ return NULL_TREE; - else + else if (integer_zerop (*xor_cmp_op)) { *xor_p = true; exp = res_ops[0]; diff --git a/gcc/testsuite/gcc.dg/pr118081.c b/gcc/testsuite/gcc.dg/pr118081.c new file mode 100644 index 00000000000..7659df7e785 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr118081.c @@ -0,0 +1,28 @@ +/* PR tree-optimization/118081 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-tree-vrp -fno-expensive-optimizations" } */ + +int a, b; + +int +foo (int f) +{ + return f ? f || 0 : f; +} + +void +bar (void) +{ + b = a ? a : 1; + int i = foo (1 ^ b); + signed char h = i - 8; + if (h) + return; + __builtin_abort (); +} + +int +main () +{ + bar (); +}