https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82677
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |wrong-code Status|UNCONFIRMED |NEW Last reconfirmed| |2017-10-23 CC| |rguenth at gcc dot gnu.org Component|inline-asm |rtl-optimization Ever confirmed|0 |1 --- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- This is RTL invariant motion hoisting the non-volatile asm out of the loop even though it is _not_ unconditionally executed. I think it is against the spirit of asm()s to be treated this way. We're handling possible NULL pointer dereferences correctly (just not in asm()s) as well. So I think LIM needs to be conservative with not always executed asm()s. It's still safe to move the asm in int main() { ulong d = 0; for (ulong i = 0; i < 3; i++) for (ulong j = 0; j < 3; j++) { ulong r; __asm__("" : "=r"(d) : "rm"((ulong)0)); udiv_qrnnd(q, r, 0, 0, (i << d)); } } thus without the if ().