This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug middle-end/34627] Incorrect branching with -Ox on hppa



------- Comment #10 from steven at gcc dot gnu dot org  2008-02-03 13:19 -------
The following code from simplify_if_then_else() triggers:

  /* Look for cases where we have (abs x) or (neg (abs X)).  */

  if (GET_MODE_CLASS (mode) == MODE_INT
      && GET_CODE (false_rtx) == NEG
      && rtx_equal_p (true_rtx, XEXP (false_rtx, 0))
      && comparison_p
      && rtx_equal_p (true_rtx, XEXP (cond, 0))
      && ! side_effects_p (true_rtx))
    switch (true_code)
      {
      case GT:
      case GE:
        return simplify_gen_unary (ABS, mode, true_rtx, mode);
      case LT:
      case LE:
        return
          simplify_gen_unary (NEG, mode,
                              simplify_gen_unary (ABS, mode, true_rtx, mode),
                              mode);
      default:
        break;
      }


with:

true_code = LT
cond == (lt (reg/v:SI 94 [ i ]) (reg:SI 98))
true_rtx == (reg/v:SI 94 [ i ])
false_rtx == (neg:SI (reg/v:SI 94 [ i ]))

or in human understandable language: "if (i < reg_98) i = i; else i = -1;"

We end up returning "(neg (abs:SI (reg/v:SI 94 [ i ])))".

The problem is that the if-condition in the quoted code does not look at what
is being compared against.  There should be a test to make sure the comparison
is against const0_rtx.


-- 


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]