Commit 30484ccf by Richard Henderson

ifcvt.c (noce_get_condition): Make certain that the condition is valid at JUMP.

        * ifcvt.c (noce_get_condition): Make certain that the condition
        is valid at JUMP.

From-SVN: r55560
parent c1740ae3
2002-07-18 Richard Henderson <rth@redhat.com>
PR optimization/7147
* ifcvt.c (noce_get_condition): Make certain that the condition
is valid at JUMP.
Thu Jul 18 13:44:51 2002 J"orn Rennecke <joern.rennecke@superh.com> Thu Jul 18 13:44:51 2002 J"orn Rennecke <joern.rennecke@superh.com>
* sh.c (barrier_align, push): Shut up compiler warnings. * sh.c (barrier_align, push): Shut up compiler warnings.
...@@ -63,7 +69,7 @@ Wed Jul 17 19:23:32 2002 J"orn Rennecke <joern.rennecke@superh.com> ...@@ -63,7 +69,7 @@ Wed Jul 17 19:23:32 2002 J"orn Rennecke <joern.rennecke@superh.com>
suppress addition when either ct or cf are zero. suppress addition when either ct or cf are zero.
2002-06-17 Eric Botcazou <ebotcazou@multimania.com> 2002-06-17 Eric Botcazou <ebotcazou@multimania.com>
Glen Nakamura <glen@imodulo.com> Glen Nakamura <glen@imodulo.com>
PR optimization/6713 PR optimization/6713
* loop.c (loop_givs_rescan): Explicitly delete the insn that * loop.c (loop_givs_rescan): Explicitly delete the insn that
......
...@@ -1496,45 +1496,73 @@ noce_try_abs (if_info) ...@@ -1496,45 +1496,73 @@ noce_try_abs (if_info)
return TRUE; return TRUE;
} }
/* Look for the condition for the jump first. We'd prefer to avoid /* Similar to get_condition, only the resulting condition must be
get_condition if we can -- it tries to look back for the contents valid at JUMP, instead of at EARLIEST. */
of an original compare. On targets that use normal integers for
comparisons, e.g. alpha, this is wasteful. */
static rtx static rtx
noce_get_condition (jump, earliest) noce_get_condition (jump, earliest)
rtx jump; rtx jump;
rtx *earliest; rtx *earliest;
{ {
rtx cond; rtx cond, set, tmp, insn;
rtx set; bool reverse;
/* If the condition variable is a register and is MODE_INT, accept it.
Otherwise, fall back on get_condition. */
if (! any_condjump_p (jump)) if (! any_condjump_p (jump))
return NULL_RTX; return NULL_RTX;
set = pc_set (jump); set = pc_set (jump);
/* If this branches to JUMP_LABEL when the condition is false,
reverse the condition. */
reverse = (GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
&& XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump));
/* If the condition variable is a register and is MODE_INT, accept it. */
cond = XEXP (SET_SRC (set), 0); cond = XEXP (SET_SRC (set), 0);
if (GET_CODE (XEXP (cond, 0)) == REG tmp = XEXP (cond, 0);
&& GET_MODE_CLASS (GET_MODE (XEXP (cond, 0))) == MODE_INT) if (REG_P (tmp) && GET_MODE_CLASS (GET_MODE (tmp)) == MODE_INT)
{ {
*earliest = jump; *earliest = jump;
/* If this branches to JUMP_LABEL when the condition is false, if (reverse)
reverse the condition. */
if (GET_CODE (XEXP (SET_SRC (set), 2)) == LABEL_REF
&& XEXP (XEXP (SET_SRC (set), 2), 0) == JUMP_LABEL (jump))
cond = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond)), cond = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond)),
GET_MODE (cond), XEXP (cond, 0), GET_MODE (cond), tmp, XEXP (cond, 1));
XEXP (cond, 1)); return cond;
} }
else
cond = get_condition (jump, earliest);
return cond; /* Otherwise, fall back on canonicalize_condition to do the dirty
work of manipulating MODE_CC values and COMPARE rtx codes. */
tmp = canonicalize_condition (jump, cond, reverse, earliest, NULL_RTX);
if (!tmp)
return NULL_RTX;
/* We are going to insert code before JUMP, not before EARLIEST.
We must therefore be certain that the given condition is valid
at JUMP by virtue of not having been modified since. */
for (insn = *earliest; insn != jump; insn = NEXT_INSN (insn))
if (INSN_P (insn) && modified_in_p (tmp, insn))
break;
if (insn == jump)
return tmp;
/* The condition was modified. See if we can get a partial result
that doesn't follow all the reversals. Perhaps combine can fold
them together later. */
tmp = XEXP (tmp, 0);
if (!REG_P (tmp) || GET_MODE_CLASS (GET_MODE (tmp)) != MODE_INT)
return NULL_RTX;
tmp = canonicalize_condition (jump, cond, reverse, earliest, tmp);
if (!tmp)
return NULL_RTX;
/* For sanity's sake, re-validate the new result. */
for (insn = *earliest; insn != jump; insn = NEXT_INSN (insn))
if (INSN_P (insn) && modified_in_p (tmp, insn))
return NULL_RTX;
return tmp;
} }
/* Return true if OP is ok for if-then-else processing. */ /* Return true if OP is ok for if-then-else processing. */
......
extern void abort (void);
extern void exit (int);
int sub1 (int val)
{
return val;
}
int testcond (int val)
{
int flag1;
{
int t1 = val;
{
int t2 = t1;
{
flag1 = sub1 (t2) ==0;
goto lab1;
};
}
lab1: ;
}
if (flag1 != 0)
return 0x4d0000;
else
return 0;
}
int main (void)
{
if (testcond (1))
abort ();
exit (0);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment