From 5874448344f74d0033faaadc5d009bcd3d2726bb Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Mon, 24 Aug 1992 06:48:59 -0400 Subject: [PATCH] (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 --- gcc/combine.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/gcc/combine.c b/gcc/combine.c index 5b9b9a446f5..2af4949e054 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -2616,16 +2616,18 @@ subst (x, from, to, in_dest, unique_copy) if ((GET_RTX_CLASS (code) == '2' || GET_RTX_CLASS (code) == 'c') && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE) { - SUBST (XEXP (XEXP (x, 0), 1), - subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 1), - XEXP (x, 1)), - pc_rtx, pc_rtx, 0)); - SUBST (XEXP (XEXP (x, 0), 2), - subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 2), - XEXP (x, 1)), - pc_rtx, pc_rtx, 0)); - - x = XEXP (x, 0); + /* Don't do this by using SUBST inside X since we might be messing + up a shared expression. */ + rtx cond = XEXP (XEXP (x, 0), 0); + rtx t_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 1), + XEXP (x, 1)), + pc_rtx, pc_rtx, 0); + rtx f_arm = subst (gen_binary (code, mode, XEXP (XEXP (x, 0), 2), + XEXP (x, 1)), + pc_rtx, pc_rtx, 0); + + + x = gen_rtx (IF_THEN_ELSE, mode, cond, t_arm, f_arm); goto restart; } @@ -2633,14 +2635,13 @@ subst (x, from, to, in_dest, unique_copy) && GET_CODE (XEXP (x, 0)) == IF_THEN_ELSE && GET_MODE (XEXP (x, 0)) == mode) { - SUBST (XEXP (XEXP (x, 0), 1), - subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 1)), - pc_rtx, pc_rtx, 0)); - SUBST (XEXP (XEXP (x, 0), 2), - subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 2)), - pc_rtx, pc_rtx, 0)); - - x = XEXP (x, 0); + rtx cond = XEXP (XEXP (x, 0), 0); + rtx t_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 1)), + pc_rtx, pc_rtx, 0); + rtx f_arm = subst (gen_unary (code, mode, XEXP (XEXP (x, 0), 2)), + pc_rtx, pc_rtx, 0); + + x = gen_rtx_combine (IF_THEN_ELSE, mode, cond, t_arm, f_arm); goto restart; } @@ -7956,9 +7957,9 @@ simplify_comparison (code, pop0, pop1) || ((code == EQ || code == NE || code == GE || code == GT || code == LE || code == LT) && (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) - >= GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode)))) + > GET_MODE_BITSIZE (tmode) - GET_MODE_BITSIZE (mode)))) { op0 = gen_lowpart_for_combine (tmode, op0); op1 = gen_lowpart_for_combine (tmode, op1); -- 2.30.2