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

           Summary: Volatile status ignored for  "(j > j)" during
                    fold_comparison of fold-const.c
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: middle-end
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: bur...@gcc.gnu.org
            Blocks: 45742


Split off from PR 45742. This might be a WONTFIX item, however, Fortran and C
behave differently.

For the C program

  int main() {
    int volatile j;
    if (j > j) notfound();
    return 0;
  }

one gets a link error ("undefined reference to `notfound'"). However, for the
equivalent Fortran program, the "if (j > j)" condition is folded away:

program main
  integer, volatile :: j
  if (j>j) call notfound
end program main


The "j > j" condition enters the middle end as:

fold_build2_stat_loc (loc=260, code=GT_EXPR, type=0x2aaaace48b28,
op0=0x2aaaacf20000, op1=0x2aaaacf20000)

then one calls at some point

fold_comparison (loc=260, code=GT_EXPR, type=0x2aaaace48b28,
op0=0x2aaaacf20000, op1=0x2aaaacf20000)

which contains

  /* Simplify comparison of something with itself.  (For IEEE
     floating-point, we can only do some of these simplifications.)  */
  if (operand_equal_p (arg0, arg1, 0))
    {
      switch (code)
        ...
    case GT_EXPR:
    case LT_EXPR:
      return constant_boolean_node (0, type);

Thus, the "if" condition is folded away without checking for the volatile.


One can argue that that's OK as "j > j" is always false. Or that the chance
that the result being different is minute for "j1 = {v} j; j2 = {v} j; if(j1 >
j2)". But somehow I had expected that C and Fortran give the same result.

Reply via email to