This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/34627] Incorrect branching with -Ox on hppa
- From: "steven at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 3 Feb 2008 13:19:40 -0000
- Subject: [Bug middle-end/34627] Incorrect branching with -Ox on hppa
- References: <bug-34627-7657@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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