From: Alan Modra Date: Tue, 22 Jan 2002 23:42:07 +0000 (+0000) Subject: combine.c (simplify_and_const_int): Don't trunc_int_for_mode "nonzero" as that might... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d0c9db30790251ccb1e4af3848aceb41ead63d71;p=gcc.git combine.c (simplify_and_const_int): Don't trunc_int_for_mode "nonzero" as that might add "1" bits. * combine.c (simplify_and_const_int): Don't trunc_int_for_mode "nonzero" as that might add "1" bits. Ensure "constop" is properly sign extened. (force_to_mode): Tweak for sign extended constop. From-SVN: r49112 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 724a8b90a2a..30d00788713 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-01-23 Alan Modra + + * combine.c (simplify_and_const_int): Don't trunc_int_for_mode + "nonzero" as that might add "1" bits. Ensure "constop" is + properly sign extened. + (force_to_mode): Tweak for sign extended constop. + 2002-01-22 Richard Henderson * config/alpha/alpha.c (some_small_symbolic_mem_operand) Use diff --git a/gcc/combine.c b/gcc/combine.c index 663fd1d6198..47ac3a8aa62 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -6701,7 +6701,8 @@ force_to_mode (x, mode, mask, reg, just_select) need it. */ if (GET_CODE (x) == AND && GET_CODE (XEXP (x, 1)) == CONST_INT - && (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) == mask) + && ((INTVAL (XEXP (x, 1)) & GET_MODE_MASK (GET_MODE (x))) + == (HOST_WIDE_INT) mask)) x = XEXP (x, 0); /* If it remains an AND, try making another AND with the bits @@ -7755,7 +7756,6 @@ simplify_and_const_int (x, mode, varop, constop) MODE. */ nonzero = nonzero_bits (varop, mode) & GET_MODE_MASK (mode); - nonzero = trunc_int_for_mode (nonzero, mode); /* Turn off all bits in the constant that are known to already be zero. Thus, if the AND isn't needed at all, we will have CONSTOP == NONZERO_BITS @@ -7823,19 +7823,22 @@ simplify_and_const_int (x, mode, varop, constop) /* If we are only masking insignificant bits, return VAROP. */ if (constop == nonzero) x = varop; - - /* Otherwise, return an AND. See how much, if any, of X we can use. */ - else if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode) - x = gen_binary (AND, mode, varop, GEN_INT (constop)); - else { + /* Otherwise, return an AND. */ constop = trunc_int_for_mode (constop, mode); - if (GET_CODE (XEXP (x, 1)) != CONST_INT - || (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) != constop) - SUBST (XEXP (x, 1), GEN_INT (constop)); + /* See how much, if any, of X we can use. */ + if (x == 0 || GET_CODE (x) != AND || GET_MODE (x) != mode) + x = gen_binary (AND, mode, varop, GEN_INT (constop)); - SUBST (XEXP (x, 0), varop); + else + { + if (GET_CODE (XEXP (x, 1)) != CONST_INT + || (unsigned HOST_WIDE_INT) INTVAL (XEXP (x, 1)) != constop) + SUBST (XEXP (x, 1), GEN_INT (constop)); + + SUBST (XEXP (x, 0), varop); + } } return x;