Commit 137e889e by Richard Kenner

(subst_prev_insn): New variable.

(try_combine): Set it.
(get_last_value): Use subst_prev_insn if set instead of looking for the first
insn before SUBST_LOW_CUID.

From-SVN: r6063
parent e39bf2d9
...@@ -159,6 +159,11 @@ static int last_call_cuid; ...@@ -159,6 +159,11 @@ static int last_call_cuid;
static rtx subst_insn; static rtx subst_insn;
/* If nonzero, this is the insn that should be presumed to be
immediately in front of `subst_insn'. */
static rtx subst_prev_insn;
/* This is the lowest CUID that `subst' is currently dealing with. /* This is the lowest CUID that `subst' is currently dealing with.
get_last_value will not return a value if the register was set at or get_last_value will not return a value if the register was set at or
after this CUID. If not for this mechanism, we could get confused if after this CUID. If not for this mechanism, we could get confused if
...@@ -1195,6 +1200,8 @@ try_combine (i3, i2, i1) ...@@ -1195,6 +1200,8 @@ try_combine (i3, i2, i1)
if (i1 && INSN_CUID (i1) > INSN_CUID (i2)) if (i1 && INSN_CUID (i1) > INSN_CUID (i2))
temp = i1, i1 = i2, i2 = temp; temp = i1, i1 = i2, i2 = temp;
subst_prev_insn = 0;
/* First check for one important special-case that the code below will /* First check for one important special-case that the code below will
not handle. Namely, the case where I1 is zero, I2 has multiple sets, not handle. Namely, the case where I1 is zero, I2 has multiple sets,
and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case, and I3 is a SET whose SET_SRC is a SET_DEST in I2. In that case,
...@@ -1307,7 +1314,8 @@ try_combine (i3, i2, i1) ...@@ -1307,7 +1314,8 @@ try_combine (i3, i2, i1)
never appear in the insn stream so giving it the same INSN_UID never appear in the insn stream so giving it the same INSN_UID
as I2 will not cause a problem. */ as I2 will not cause a problem. */
i1 = gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2, subst_prev_insn = i1
= gen_rtx (INSN, VOIDmode, INSN_UID (i2), 0, i2,
XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0); XVECEXP (PATTERN (i2), 0, 1), -1, 0, 0);
SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0)); SUBST (PATTERN (i2), XVECEXP (PATTERN (i2), 0, 0));
...@@ -9494,6 +9502,11 @@ get_last_value (x) ...@@ -9494,6 +9502,11 @@ get_last_value (x)
{ {
rtx insn, set; rtx insn, set;
/* If there is an insn that is supposed to be immediately
in front of subst_insn, use it. */
if (subst_prev_insn != 0)
insn = subst_prev_insn;
else
for (insn = prev_nonnote_insn (subst_insn); for (insn = prev_nonnote_insn (subst_insn);
insn && INSN_CUID (insn) >= subst_low_cuid; insn && INSN_CUID (insn) >= subst_low_cuid;
insn = prev_nonnote_insn (insn)) insn = prev_nonnote_insn (insn))
......
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