diff options
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/combine.c | 9 |
2 files changed, 11 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 57a1578..3622483 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2016-12-19 Dominik Vogt <vogt@linux.vnet.ibm.com> + + * combine.c (change_zero_ext): Skip generation of redundant AND. + 2016-12-19 Krister Walfridsson <krister.walfridsson@gmail.com> * config/netbsd.h (LINK_EH_SPEC): Define. diff --git a/gcc/combine.c b/gcc/combine.c index 473ffc4..e74ff4c 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -11289,8 +11289,13 @@ change_zero_ext (rtx pat) else continue; - wide_int mask = wi::mask (size, false, GET_MODE_PRECISION (mode)); - x = gen_rtx_AND (mode, x, immed_wide_int_const (mask, mode)); + if (!(GET_CODE (x) == LSHIFTRT + && CONST_INT_P (XEXP (x, 1)) + && size + INTVAL (XEXP (x, 1)) == GET_MODE_PRECISION (mode))) + { + 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; |