Commit 077a148b by Roger Sayle Committed by Roger Sayle

simplify-rtx.c (simplify_replace_rtx): Avoid allocating duplicate RTL nodes.


	* simplify-rtx.c (simplify_replace_rtx): Avoid allocating duplicate
	RTL nodes.  If an operator's operands are unchanged, return the
	original argument unchanged.

From-SVN: r72941
parent 6cadb6e3
2003-10-25 Roger Sayle <roger@eyesopen.com>
* simplify-rtx.c (simplify_replace_rtx): Avoid allocating duplicate
RTL nodes. If an operator's operands are unchanged, return the
original argument unchanged.
2003-10-26 Graham Stott <graham.stott@btinternet.com> 2003-10-26 Graham Stott <graham.stott@btinternet.com>
Fix bootstrap failure. Fix bootstrap failure.
......
...@@ -264,6 +264,8 @@ simplify_replace_rtx (rtx x, rtx old, rtx new) ...@@ -264,6 +264,8 @@ simplify_replace_rtx (rtx x, rtx old, rtx new)
{ {
enum rtx_code code = GET_CODE (x); enum rtx_code code = GET_CODE (x);
enum machine_mode mode = GET_MODE (x); enum machine_mode mode = GET_MODE (x);
enum machine_mode op_mode;
rtx op0, op1, op2;
/* If X is OLD, return NEW. Otherwise, if this is an expression, try /* If X is OLD, return NEW. Otherwise, if this is an expression, try
to build a new expression substituting recursively. If we can't do to build a new expression substituting recursively. If we can't do
...@@ -275,75 +277,77 @@ simplify_replace_rtx (rtx x, rtx old, rtx new) ...@@ -275,75 +277,77 @@ simplify_replace_rtx (rtx x, rtx old, rtx new)
switch (GET_RTX_CLASS (code)) switch (GET_RTX_CLASS (code))
{ {
case '1': case '1':
{ op0 = XEXP (x, 0);
enum machine_mode op_mode = GET_MODE (XEXP (x, 0)); op_mode = GET_MODE (op0);
rtx op = (XEXP (x, 0) == old op0 = simplify_replace_rtx (op0, old, new);
? new : simplify_replace_rtx (XEXP (x, 0), old, new)); if (op0 == XEXP (x, 0))
return x;
return simplify_gen_unary (code, mode, op, op_mode); return simplify_gen_unary (code, mode, op0, op_mode);
}
case '2': case '2':
case 'c': case 'c':
return op0 = simplify_replace_rtx (XEXP (x, 0), old, new);
simplify_gen_binary (code, mode, op1 = simplify_replace_rtx (XEXP (x, 1), old, new);
simplify_replace_rtx (XEXP (x, 0), old, new), if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
simplify_replace_rtx (XEXP (x, 1), old, new)); return x;
return simplify_gen_binary (code, mode, op0, op1);
case '<': case '<':
{ op0 = XEXP (x, 0);
enum machine_mode op_mode = (GET_MODE (XEXP (x, 0)) != VOIDmode op1 = XEXP (x, 1);
? GET_MODE (XEXP (x, 0)) op_mode = GET_MODE (op0) != VOIDmode ? GET_MODE (op0) : GET_MODE (op1);
: GET_MODE (XEXP (x, 1))); op0 = simplify_replace_rtx (op0, old, new);
rtx op0 = simplify_replace_rtx (XEXP (x, 0), old, new); op1 = simplify_replace_rtx (op1, old, new);
rtx op1 = simplify_replace_rtx (XEXP (x, 1), old, new); if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
return simplify_gen_relational (code, mode, op_mode, op0, op1); return x;
} return simplify_gen_relational (code, mode, op_mode, op0, op1);
case '3': case '3':
case 'b': case 'b':
{ op0 = XEXP (x, 0);
enum machine_mode op_mode = GET_MODE (XEXP (x, 0)); op_mode = GET_MODE (op0);
rtx op0 = simplify_replace_rtx (XEXP (x, 0), old, new); op0 = simplify_replace_rtx (op0, old, new);
op1 = simplify_replace_rtx (XEXP (x, 1), old, new);
return op2 = simplify_replace_rtx (XEXP (x, 2), old, new);
simplify_gen_ternary (code, mode, if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1) && op2 == XEXP (x, 2))
(op_mode != VOIDmode return x;
? op_mode if (op_mode == VOIDmode)
: GET_MODE (op0)), op_mode = GET_MODE (op0);
op0, return simplify_gen_ternary (code, mode, op_mode, op0, op1, op2);
simplify_replace_rtx (XEXP (x, 1), old, new),
simplify_replace_rtx (XEXP (x, 2), old, new));
}
case 'x': case 'x':
/* The only case we try to handle is a SUBREG. */ /* The only case we try to handle is a SUBREG. */
if (code == SUBREG) if (code == SUBREG)
{ {
rtx exp; op0 = simplify_replace_rtx (SUBREG_REG (x), old, new);
exp = simplify_gen_subreg (GET_MODE (x), if (op0 == SUBREG_REG (x))
simplify_replace_rtx (SUBREG_REG (x), return x;
old, new), op0 = simplify_gen_subreg (GET_MODE (x), op0,
GET_MODE (SUBREG_REG (x)), GET_MODE (SUBREG_REG (x)),
SUBREG_BYTE (x)); SUBREG_BYTE (x));
if (exp) return op0 ? op0 : x;
x = exp;
} }
return x; break;
case 'o': case 'o':
if (code == MEM) if (code == MEM)
return replace_equiv_address_nv (x, {
simplify_replace_rtx (XEXP (x, 0), op0 = simplify_replace_rtx (XEXP (x, 0), old, new);
old, new)); if (op0 == XEXP (x, 0))
return x;
return replace_equiv_address_nv (x, op0);
}
else if (code == LO_SUM) else if (code == LO_SUM)
{ {
rtx op0 = simplify_replace_rtx (XEXP (x, 0), old, new); op0 = simplify_replace_rtx (XEXP (x, 0), old, new);
rtx op1 = simplify_replace_rtx (XEXP (x, 1), old, new); op1 = simplify_replace_rtx (XEXP (x, 1), old, new);
/* (lo_sum (high x) x) -> x */ /* (lo_sum (high x) x) -> x */
if (GET_CODE (op0) == HIGH && rtx_equal_p (XEXP (op0, 0), op1)) if (GET_CODE (op0) == HIGH && rtx_equal_p (XEXP (op0, 0), op1))
return op1; return op1;
if (op0 == XEXP (x, 0) && op1 == XEXP (x, 1))
return x;
return gen_rtx_LO_SUM (mode, op0, op1); return gen_rtx_LO_SUM (mode, op0, op1);
} }
else if (code == REG) else if (code == REG)
...@@ -351,11 +355,10 @@ simplify_replace_rtx (rtx x, rtx old, rtx new) ...@@ -351,11 +355,10 @@ simplify_replace_rtx (rtx x, rtx old, rtx new)
if (REG_P (old) && REGNO (x) == REGNO (old)) if (REG_P (old) && REGNO (x) == REGNO (old))
return new; return new;
} }
break;
return x;
default: default:
return x; break;
} }
return x; return x;
} }
......
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