aboutsummaryrefslogtreecommitdiff
path: root/gcc/combine.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2000-07-30 18:35:53 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2000-07-30 18:35:53 +0000
commit49219895115ee8d9391c29912b057a7a7f58807b (patch)
tree7013ddfaa893aa1d122d9f7e462aa5eb0c926e59 /gcc/combine.c
parent25af74a0a73a453dccba99e7c91fbfd5d2fe1a53 (diff)
downloadgcc-49219895115ee8d9391c29912b057a7a7f58807b.zip
gcc-49219895115ee8d9391c29912b057a7a7f58807b.tar.gz
gcc-49219895115ee8d9391c29912b057a7a7f58807b.tar.bz2
* combine.c (if_then_else_cond): Be sure that mode fits in HOST_WIDE_INT
From-SVN: r35347
Diffstat (limited to 'gcc/combine.c')
-rw-r--r--gcc/combine.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 6ebaadf..55be324 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -7210,7 +7210,6 @@ if_then_else_cond (x, ptrue, pfalse)
{
enum machine_mode mode = GET_MODE (x);
enum rtx_code code = GET_CODE (x);
- unsigned int size = GET_MODE_BITSIZE (mode);
rtx cond0, cond1, true0, true1, false0, false1;
unsigned HOST_WIDE_INT nz;
@@ -7361,9 +7360,9 @@ if_then_else_cond (x, ptrue, pfalse)
true0 = operand_subword (true0, SUBREG_WORD (x), 0, mode);
false0 = operand_subword (false0, SUBREG_WORD (x), 0, mode);
}
- *ptrue = force_to_mode (true0, mode, GET_MODE_MASK (mode), NULL_RTX, 0);
+ *ptrue = force_to_mode (true0, mode, ~(HOST_WIDE_INT) 0, NULL_RTX, 0);
*pfalse
- = force_to_mode (false0, mode, GET_MODE_MASK (mode), NULL_RTX, 0);
+ = force_to_mode (false0, mode, ~(HOST_WIDE_INT) 0, NULL_RTX, 0);
return cond0;
}
@@ -7376,14 +7375,18 @@ if_then_else_cond (x, ptrue, pfalse)
/* If X is known to be either 0 or -1, those are the true and
false values when testing X. */
- else if (num_sign_bit_copies (x, mode) == size)
+ else if (x == constm1_rtx || x == const0_rtx
+ || (mode != VOIDmode
+ && num_sign_bit_copies (x, mode) == GET_MODE_BITSIZE (mode)))
{
*ptrue = constm1_rtx, *pfalse = const0_rtx;
return x;
}
/* Likewise for 0 or a single bit. */
- else if (exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
+ else if (mode != VOIDmode
+ && GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
+ && exact_log2 (nz = nonzero_bits (x, mode)) >= 0)
{
*ptrue = GEN_INT (nz), *pfalse = const0_rtx;
return x;