> I just noticed something very surprising. There's a clause in
> general_operand (recog.c):
>
>      if (! volatile_ok && MEM_VOLATILE_P (op))
>          return 0;
>
> Oh... so, a MEM_VOLATILE_P is _not_ a general operand? Why? This is also
> not referred to in the documentation of general operand so it kind of
> caught me by surprise.

It's more of the other way around: MEM_VOLATILE_P is a general operand unless 
explicitly requested via init_recog_no_volatile.  Some passes, like combine, 
don't track the volatileness of operands precisely, so they disable their 
manipulation altogether to avoid generating wrong code.

-- 
Eric Botcazou

Reply via email to