From: Adam Nemet Date: Sun, 29 Jan 2006 03:08:38 +0000 (+0000) Subject: combine.c (simplify_comparison ): Check TRULY_NOOP_TRUNCATION before start using... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1e84b34e7473adaa56186f8dad3d9db31ffd75b5;p=gcc.git combine.c (simplify_comparison ): Check TRULY_NOOP_TRUNCATION before start using a subreg. * combine.c (simplify_comparison ): Check TRULY_NOOP_TRUNCATION before start using a subreg. * config/mips/mips.md (*branch_zero, *branch_zero_inverted, *branch_equality, *branch_equality_inverted, *branch_equality_mips16): Remove mode check from comparisons. From-SVN: r110358 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ec8ba0fd9f4..b9900bf5776 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2006-01-28 Adam Nemet + + * combine.c (simplify_comparison ): Check + TRULY_NOOP_TRUNCATION before start using a subreg. + + * config/mips/mips.md (*branch_zero, + *branch_zero_inverted, *branch_equality, + *branch_equality_inverted, *branch_equality_mips16): + Remove mode check from comparisons. + 2006-01-28 Kenneth Zadeck * config/mips/mips-protos.h (mips_set_live_on_entry): Deleted. diff --git a/gcc/combine.c b/gcc/combine.c index 2c90be5a2e4..ee8d98d9dab 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -10295,14 +10295,27 @@ simplify_comparison (enum rtx_code code, rtx *pop0, rtx *pop1) /* If this AND operation is really a ZERO_EXTEND from a narrower mode, the constant fits within that mode, and this is either an equality or unsigned comparison, try to do this comparison in - the narrower mode. */ + the narrower mode. + + Note that in: + + (ne:DI (and:DI (reg:DI 4) (const_int 0xffffffff)) (const_int 0)) + -> (ne:DI (reg:SI 4) (const_int 0)) + + unless TRULY_NOOP_TRUNCATION allows it or the register is + known to hold a value of the required mode the + transformation is invalid. */ if ((equality_comparison_p || unsigned_comparison_p) && GET_CODE (XEXP (op0, 1)) == CONST_INT && (i = exact_log2 ((INTVAL (XEXP (op0, 1)) & GET_MODE_MASK (mode)) + 1)) >= 0 && const_op >> i == 0 - && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode) + && (tmode = mode_for_size (i, MODE_INT, 1)) != BLKmode + && (TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (tmode), + GET_MODE_BITSIZE (GET_MODE (op0))) + || (REG_P (XEXP (op0, 0)) + && reg_truncated_to_mode (tmode, XEXP (op0, 0))))) { op0 = gen_lowpart (tmode, XEXP (op0, 0)); continue; diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index af8f709b53f..3d5585718d8 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -4316,9 +4316,9 @@ (define_insn "*branch_zero" [(set (pc) (if_then_else - (match_operator:GPR 0 "comparison_operator" - [(match_operand:GPR 2 "register_operand" "d") - (const_int 0)]) + (match_operator 0 "comparison_operator" + [(match_operand:GPR 2 "register_operand" "d") + (const_int 0)]) (label_ref (match_operand 1 "" "")) (pc)))] "!TARGET_MIPS16" @@ -4336,9 +4336,9 @@ (define_insn "*branch_zero_inverted" [(set (pc) (if_then_else - (match_operator:GPR 0 "comparison_operator" - [(match_operand:GPR 2 "register_operand" "d") - (const_int 0)]) + (match_operator 0 "comparison_operator" + [(match_operand:GPR 2 "register_operand" "d") + (const_int 0)]) (pc) (label_ref (match_operand 1 "" ""))))] "!TARGET_MIPS16" @@ -4358,9 +4358,9 @@ (define_insn "*branch_equality" [(set (pc) (if_then_else - (match_operator:GPR 0 "equality_operator" - [(match_operand:GPR 2 "register_operand" "d") - (match_operand:GPR 3 "register_operand" "d")]) + (match_operator 0 "equality_operator" + [(match_operand:GPR 2 "register_operand" "d") + (match_operand:GPR 3 "register_operand" "d")]) (label_ref (match_operand 1 "" "")) (pc)))] "!TARGET_MIPS16" @@ -4378,9 +4378,9 @@ (define_insn "*branch_equality_inverted" [(set (pc) (if_then_else - (match_operator:GPR 0 "equality_operator" - [(match_operand:GPR 2 "register_operand" "d") - (match_operand:GPR 3 "register_operand" "d")]) + (match_operator 0 "equality_operator" + [(match_operand:GPR 2 "register_operand" "d") + (match_operand:GPR 3 "register_operand" "d")]) (pc) (label_ref (match_operand 1 "" ""))))] "!TARGET_MIPS16" @@ -4400,9 +4400,9 @@ (define_insn "*branch_equality_mips16" [(set (pc) (if_then_else - (match_operator:GPR 0 "equality_operator" - [(match_operand:GPR 1 "register_operand" "d,t") - (const_int 0)]) + (match_operator 0 "equality_operator" + [(match_operand:GPR 1 "register_operand" "d,t") + (const_int 0)]) (match_operand 2 "pc_or_label_operand" "") (match_operand 3 "pc_or_label_operand" "")))] "TARGET_MIPS16"