https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61772
Bug ID: 61772 Summary: RTL if-conversion removes asm volatile goto Product: gcc Version: 4.8.4 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: matz at gcc dot gnu.org This is reduced from a bug our kernel people hit. The problem is the use of asm volatile gotos inside a conditional, when the outgoing blocks of the asm-goto are itself both empty. Ala: ------------------------- snip --------------------------------------- /* { 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); } ------------------ snap ---------------------------------------------- This should have two "XXX" in the resulting assembler, but will have only one with any optimization level. It's the RTL if conversion that removes the seemingly empty second dec_and_test(), because the then-block is empty and because it doesn't check that the removed jump really is only a jump without side effects. I don't know if it's a regression (it probably isn't as I don't see that ifcvt.c was touched with the introduction of asm gotos), but it at least affects trunk and 4.8.