diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-08-16 18:48:16 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-08-16 18:48:16 +0200 |
commit | 1b13411a13e274d5e01b73704df9edd2639eedb4 (patch) | |
tree | 89718b908de8516c29a214667bdc12cc31bcaaf8 /gcc/expmed.c | |
parent | 4a7f57d5390a3afbd5f1dc5050c409fbf1a34e54 (diff) | |
download | gcc-1b13411a13e274d5e01b73704df9edd2639eedb4.zip gcc-1b13411a13e274d5e01b73704df9edd2639eedb4.tar.gz gcc-1b13411a13e274d5e01b73704df9edd2639eedb4.tar.bz2 |
re PR middle-end/67485 (expmed.c sanitizer detects overflow)
PR middle-end/67485
* expmed.c (expand_mult_const): Change val_so_far's type to UHWI,
only cast it to SHWI for the final comparison.
* gcc.c-torture/compile/pr67485.c: New test.
From-SVN: r239507
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index 674c8f0..1cedf02 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -3055,7 +3055,7 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val, rtx target, const struct algorithm *alg, enum mult_variant variant) { - HOST_WIDE_INT val_so_far; + unsigned HOST_WIDE_INT val_so_far; rtx_insn *insn; rtx accum, tem; int opno; @@ -3105,14 +3105,14 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val, tem = expand_shift (LSHIFT_EXPR, mode, op0, log, NULL_RTX, 0); accum = force_operand (gen_rtx_PLUS (mode, accum, tem), add_target ? add_target : accum_target); - val_so_far += HOST_WIDE_INT_1 << log; + val_so_far += HOST_WIDE_INT_1U << log; break; case alg_sub_t_m2: tem = expand_shift (LSHIFT_EXPR, mode, op0, log, NULL_RTX, 0); accum = force_operand (gen_rtx_MINUS (mode, accum, tem), add_target ? add_target : accum_target); - val_so_far -= HOST_WIDE_INT_1 << log; + val_so_far -= HOST_WIDE_INT_1U << log; break; case alg_add_t2_m: @@ -3188,7 +3188,7 @@ expand_mult_const (machine_mode mode, rtx op0, HOST_WIDE_INT val, nmode = GET_MODE_INNER (mode); val &= GET_MODE_MASK (nmode); val_so_far &= GET_MODE_MASK (nmode); - gcc_assert (val == val_so_far); + gcc_assert (val == (HOST_WIDE_INT) val_so_far); return accum; } |