[Bug middle-end/53049] expand/TER unappropriate moving unspec volatile

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Apr 20 09:21:00 GMT 2012


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53049

--- Comment #5 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-04-20 09:20:44 UTC ---
It's not easy to restrict movement in this case (and no other tree transform
would bother).  Consider sinking and

void test2 (unsigned val, bool flag)
{
  val = 65535U / val;

  __builtin_avr_cli();
  if (flag)
    ivar = val;
  else
    ivar = 0;
  __builtin_avr_sei();
}

then you'd get val = 65535U / val; sunk into the if() arm beause its unused
on the else arm.

On the GIMPLE leven we don't have something like a "scheduling barrier",
we only have barriers for loads/stores.  A "scheduling barrier" would need
to be implemented by means of providing abnormal entry / exit to a basic-block,
not sure if we'd want to go that way (but this is the only way that would
make it "magically" work).

So - you certainly could "fix" TER, but that would not fix the underlying
problem of GIMPLE lacking a scheduling barrier which is what you appearantly
are after at.



More information about the Gcc-bugs mailing list