diff options
author | Jakub Jelinek <jakub@redhat.com> | 2001-12-21 12:07:59 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2001-12-21 12:07:59 +0100 |
commit | 7958f3c750d0807cc854efd41a239d57c5c8b4d9 (patch) | |
tree | 8cce78d4e8c0521a29bede0e4e841a0dcfe7d4d3 /gcc/combine.c | |
parent | b7fb9feb713f47d880d251ff1323e40fc37c14c7 (diff) | |
download | gcc-7958f3c750d0807cc854efd41a239d57c5c8b4d9.zip gcc-7958f3c750d0807cc854efd41a239d57c5c8b4d9.tar.gz gcc-7958f3c750d0807cc854efd41a239d57c5c8b4d9.tar.bz2 |
combine.c (nonzero_bits): If using reg_nonzero_bits, we don't know anything about bits outside of X mode.
* combine.c (nonzero_bits): If using reg_nonzero_bits,
we don't know anything about bits outside of X mode.
(num_sign_bit_copies): Likewise.
From-SVN: r48239
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index a0b08ec..1fa63b8 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7990,7 +7990,14 @@ nonzero_bits (x, mode) return nonzero_bits (tem, mode); } else if (nonzero_sign_valid && reg_nonzero_bits[REGNO (x)]) - return reg_nonzero_bits[REGNO (x)] & nonzero; + { + unsigned HOST_WIDE_INT mask = reg_nonzero_bits[REGNO (x)]; + + if (GET_MODE_BITSIZE (GET_MODE (x)) < mode_width) + /* We don't know anything about the upper bits. */ + mask |= GET_MODE_MASK (mode) ^ GET_MODE_MASK (GET_MODE (x)); + return nonzero & mask; + } else return nonzero; @@ -8385,7 +8392,8 @@ num_sign_bit_copies (x, mode) if (tem != 0) return num_sign_bit_copies (tem, mode); - if (nonzero_sign_valid && reg_sign_bit_copies[REGNO (x)] != 0) + if (nonzero_sign_valid && reg_sign_bit_copies[REGNO (x)] != 0 + && GET_MODE_BITSIZE (GET_MODE (x)) == bitwidth) return reg_sign_bit_copies[REGNO (x)]; break; |