diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2016-05-03 10:29:55 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2016-05-03 10:29:55 +0000 |
commit | 50891606a95368edd688fa9dc73003b1dfd68983 (patch) | |
tree | 6ec5e9118f563242bcd6663e613ba47f0e2d5557 /gcc | |
parent | f80041efb991e4326971dea550157192f912d9a4 (diff) | |
download | gcc-50891606a95368edd688fa9dc73003b1dfd68983.zip gcc-50891606a95368edd688fa9dc73003b1dfd68983.tar.gz gcc-50891606a95368edd688fa9dc73003b1dfd68983.tar.bz2 |
PR 70687: Use wide_int in combine.c:change_zero_ext
PR 70687 reports a case where combine.c mishandles integer modes
wider than unsigned HOST_WIDE_INT. I don't have a testcase since
the PR is just pointing out the hole.
Also, I think a ZERO_EXTEND of a vector mode could in principle satisfy
the subreg condition but wouldn't be equivalent to an AND. E.g.:
(zero_extend:V4DI (subreg:V4SI (reg:V4DI R) 0))
Tested on x86_64-linux-gnu.
gcc/
PR rtl-optimization/70687
* combine.c (change_zero_ext): Check for scalar modes. Use wide_int
instead of unsigned HOST_WIDE_INT.
From-SVN: r235811
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/combine.c | 8 |
2 files changed, 9 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 608f64b..cc520e8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-03 Richard Sandiford <richard.sandiford@arm.com> + + PR rtl-optimization/70687 + * combine.c (change_zero_ext): Check for scalar modes. Use wide_int + instead of unsigned HOST_WIDE_INT. + 2016-05-03 Bernd Schmidt <bschmidt@redhat.com> PR rtl-optimization/44281 diff --git a/gcc/combine.c b/gcc/combine.c index 1d0e8be..0ab3f97 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -11096,6 +11096,7 @@ change_zero_ext (rtx *src) XEXP (x, 0), GEN_INT (start)); } else if (GET_CODE (x) == ZERO_EXTEND + && SCALAR_INT_MODE_P (mode) && GET_CODE (XEXP (x, 0)) == SUBREG && GET_MODE (SUBREG_REG (XEXP (x, 0))) == mode && subreg_lowpart_p (XEXP (x, 0))) @@ -11106,11 +11107,8 @@ change_zero_ext (rtx *src) else continue; - unsigned HOST_WIDE_INT mask = 1; - mask <<= size; - mask--; - - x = gen_rtx_AND (mode, x, GEN_INT (mask)); + wide_int mask = wi::mask (size, false, GET_MODE_PRECISION (mode)); + x = gen_rtx_AND (mode, x, immed_wide_int_const (mask, mode)); SUBST (**iter, x); changed = true; |