Hi,

On Wed, 26 Oct 2011, Kai Tietz wrote:

> > Yes, this part introduced different behavior for this small case,
> >
> > int f(char *i, int j)
> > {
> >        if (*i && j!=2)
> >                return *i;
> >        else
> >                return j;
> > }
> 
> Well, as far as I understand C specification and sequence points, it 
> makes indeed a difference to do branch-cost optimization on instructions 
> might cause a signal traps. As signal could be handled in specifc 
> handlers. You need to consider here that short-circuit optimization 
> assumes associative law on operands.  So right-hand side might be 
> evaluaded before the left-hand-side.  And this indeed breaks IMHO the 
> sequences as mentioned in C specification about conditions.

I'm not sure in this specific case.  If it had been:

if (*a && *b) ...

the you'd be right.  The side-effect of dereferencing a must happen before 
*b, and hence transforming this into (*a!=0)&(*b!=0) would be wrong.  But 
in the case at hand we only have one potentially problematic (aka 
detectable) side-effect (*i), so I don't think you could construct a 
program that detects the difference.  It would entail detecting that 
"j!=2" was already evaluated, when (say) the segfault happens, but you 
can't as the variable is non-volatile.  It also can't happen that the 
side-effect *i does not occur (which also would be a problem).  So, I 
think there wasn't an actual problem before, and it had fewer jumps.


Ciao,
Michael.

Reply via email to