https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85599

--- Comment #4 from janus at gcc dot gnu.org ---
(In reply to kargl from comment #1)
> The behavior may not be buggy, and it's best not to depend
> on side-effects.  From F2018,
> 
> 10.1.5.4.2 Evaluation of logical intrinsic operations
> 
>   Once the interpretation of a logical intrinsic operation is
>   established, the processor may evaluate any other expression
>   that is logically equivalent, provided that the integrity of
>   parentheses in any expression is not violated.
> 
>   Two expressions of type logical are logically equivalent
>   if their values are equal for all possible values of their
>   primaries.
> 

Thanks for the standard quote, Steve. It certainly goes in the right direction,
but I feel like it's not quite to the point.

Some other (possibly) relevant passages I found in the 2008 standard:

*****
7.1.7 Evaluation of operands
1 It is not necessary for a processor to evaluate all of the operands of an
expression, or to evaluate entirely each operand, if the value of the
expression can be determined otherwise.
*****

That also sounds like optimizing away the function call might be valid, but
then there is also this one:

*****
7.1.4 Evaluation of operations
2 The evaluation of a function reference shall neither affect nor be affected
by the evaluation of any other entity within the statement.
*****

The way I read it, gfortran's implementation currently violates this clause for
the expression "flag = flag .and. check()", because the evaluation of the
function reference "check()" is affected by the value of the variable "flag".

So I'd argue that the bug here is not missed-optimization in the first case,
but over-optimization in the second, after all.

What worries me most is that other compilers choose different implementations.
Can this kind of code really be processor-dependent?

Reply via email to