Commit 58744483 by Richard Kenner

(subst): When moving operation inside IF_THEN_ELSE, make a new rtx

instead of using SUBST due to sharing.

(simplify_comparison): Correct test for sign extension when trying to
widen comparison.

From-SVN: r1938
parent c7d2d61d
...@@ -2616,16 +2616,18 @@ subst (x, from, to, in_dest, unique_copy) ...@@ -2616,16 +2616,18 @@ subst (x, from, to, in_dest, unique_copy)
if ((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c') if ((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c')
&& GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE) && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE)
{ {
SUBST (XEXP (XEXP (x, 0), 1), /* Don't do this by using SUBST inside X since we might be messing
subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 1), up a shared expression. */
XEXP (x, 1)), rtx cond = XEXP (XEXP (x, 0), 0);
pc_rtx, pc_rtx, 0)); rtx t_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 1),
SUBST (XEXP (XEXP (x, 0), 2), XEXP (x, 1)),
subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 2), pc_rtx, pc_rtx, 0);
XEXP (x, 1)), rtx f_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 2),
pc_rtx, pc_rtx, 0)); XEXP (x, 1)),
pc_rtx, pc_rtx, 0);
x = XEXP (x, 0);
x = gen_rtx (IF_THEN_ELSE, mode, cond, t_arm, f_arm);
goto restart; goto restart;
} }
...@@ -2633,14 +2635,13 @@ subst (x, from, to, in_dest, unique_copy) ...@@ -2633,14 +2635,13 @@ subst (x, from, to, in_dest, unique_copy)
&& GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE
&& GET_MODE (XEXP (x, 0)) == mode) && GET_MODE (XEXP (x, 0)) == mode)
{ {
SUBST (XEXP (XEXP (x, 0), 1), rtx cond = XEXP (XEXP (x, 0), 0);
subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 1)), rtx t_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 1)),
pc_rtx, pc_rtx, 0)); pc_rtx, pc_rtx, 0);
SUBST (XEXP (XEXP (x, 0), 2), rtx f_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 2)),
subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 2)), pc_rtx, pc_rtx, 0);
pc_rtx, pc_rtx, 0));
x = gen_rtx_combine (IF_THEN_ELSE, mode, cond, t_arm, f_arm);
x = XEXP (x, 0);
goto restart; goto restart;
} }
...@@ -7956,9 +7957,9 @@ simplify_comparison (code, pop0, pop1) ...@@ -7956,9 +7957,9 @@ simplify_comparison (code, pop0, pop1)
|| ((code == EQ || code == NE || ((code == EQ || code == NE
|| code == GE || code == GT || code == LE || code == LT) || code == GE || code == GT || code == LE || code == LT)
&& (num_sign_bit_copies (op0, tmode) && (num_sign_bit_copies (op0, tmode)
>= GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode)) > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))
&& (num_sign_bit_copies (op1, tmode) && (num_sign_bit_copies (op1, tmode)
>= GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode)))) > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode))))
{ {
op0 = gen_lowpart_for_combine (tmode, op0); op0 = gen_lowpart_for_combine (tmode, op0);
op1 = gen_lowpart_for_combine (tmode, op1); op1 = gen_lowpart_for_combine (tmode, op1);
......
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