combine lhs zero_extract fix (PR78186)
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 3 Nov 2016 16:04:22 +0000 (17:04 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 3 Nov 2016 16:04:22 +0000 (17:04 +0100)
PR rtl-optimization/78186
* combine.c (change_zero_ext): Mask the RHS of a zero_extract as
well, when converting to IOR.

From-SVN: r241824

gcc/ChangeLog
gcc/combine.c

index 920d870a38aee36254944b449db596ebe7efdffa..680b54947c2ced6a328a1b1dc842e71c493ff695 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-03  Segher Boessenkool  <segher@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.
+
 2016-11-03  Eric Botcazou  <ebotcazou@adacore.com>
 
        * config/sparc/sparc.md (vec_interleave_lowv8qi): Delete.
index 6cbb8cfb23ec3e18a9868e4a5f2f6784a0d75d7c..c605b1a7831f182b4c8dad756c64f0ca30e42ed9 100644 (file)
@@ -11190,6 +11190,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);