From 50891606a95368edd688fa9dc73003b1dfd68983 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 3 May 2016 10:29:55 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/combine.c | 8 +++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 608f64b6389..cc520e895ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-03 Richard Sandiford + + 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 PR rtl-optimization/44281 diff --git a/gcc/combine.c b/gcc/combine.c index 1d0e8beeb2c..0ab3f97db69 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; -- 2.30.2