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 ().

Reply via email to