I managed to forget to mask the thing inserted.  Tested on powerpc64-linux
{-m32,-m64}, and Bin tested on arm.  Applying to trunk.


Segher


2016-11-03  Segher Boessenkool  <seg...@kernel.crashing.org>

        PR rtl-optimization/78186
        * combine.c (change_zero_ext): Mask the RHS of a zero_extract as
        well, when converting to IOR.

---
 gcc/combine.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/gcc/combine.c b/gcc/combine.c
index 7c21fe4..7ed0a62 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -11224,6 +11224,9 @@ change_zero_ext (rtx pat)
       rtx x = gen_rtx_AND (mode, reg, immed_wide_int_const (mask, mode));
       rtx y = simplify_gen_binary (ASHIFT, mode, SET_SRC (pat),
                                   GEN_INT (offset));
+      wide_int mask2 = wi::shifted_mask (offset, width, false, reg_width);
+      y = simplify_gen_binary (AND, mode, y,
+                              immed_wide_int_const (mask2, mode));
       rtx z = simplify_gen_binary (IOR, mode, x, y);
       SUBST (SET_DEST (pat), reg);
       SUBST (SET_SRC (pat), z);
-- 
1.9.3

Reply via email to