2014-07-15 Michael Matz PR rtl-optimization/61772 * ifcvt.c (dead_or_predicable): Check jump to be free of side effects. * gcc.dg/torture/pr61772.c: New test. Index: gcc/testsuite/gcc.dg/torture/pr61772.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr61772.c (revision 0) +++ gcc/testsuite/gcc.dg/torture/pr61772.c (revision 212563) @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-final { scan-assembler-times "XXX" 2 } } */ + +static inline __attribute__((always_inline)) int dec_and_test (int *i) +{ + asm volatile goto ("XXX %0, %l[cc_label]" + : : "m" (*i) : "memory" : cc_label); + return 0; +cc_label: + return 1; +} +extern int getit (int *); +int f (int *i, int cond) +{ + if (cond) { + getit (0); + if (dec_and_test (i)) + getit (i); + return 42; + } + if (dec_and_test (i)) + (void)1; + return getit (i); +} Index: gcc/ifcvt.c =================================================================== --- gcc/ifcvt.c (revision 212562) +++ gcc/ifcvt.c (revision 212563) @@ -4138,6 +4138,8 @@ dead_or_predicable (basic_block test_bb, if (JUMP_P (end)) { + if (!onlyjump_p (end)) + return FALSE; if (head == end) { head = end = NULL_RTX;