]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix target/94557 PowerPC regression on GCC 9 (variable vec_extract)
authorMichael Meissner <2019-02-12 Michael Meissner meissner@linux.ibm.com>
Thu, 16 Apr 2020 16:49:22 +0000 (12:49 -0400)
committerMichael Meissner <2019-02-12 Michael Meissner meissner@linux.ibm.com>
Thu, 16 Apr 2020 16:49:22 +0000 (12:49 -0400)
2020-04-16  Michael Meissner  <meissner@linux.ibm.com>

PR target/94557
* config/rs6000/rs6000.c (rs6000_adjust_vec_address): Fix
regression caused by PR target/93932 backport.  Mask variable
vector extract index so it does not go beyond the vector when
extracting a vector element from memory.

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index f90fe0d471801246ce2b7ea6768f72018d06573e..a7949385573b63473bd2238be34aecdd2d4b31eb 100644 (file)
@@ -1,3 +1,11 @@
+2020-04-16  Michael Meissner  <meissner@linux.ibm.com>
+
+       PR target/94557
+       * config/rs6000/rs6000.c (rs6000_adjust_vec_address): Fix
+       regression caused by PR target/93932 backport.  Mask variable
+       vector extract index so it does not go beyond the vector when
+       extracting a vector element from memory.
+
 2020-04-16  Richard Biener  <rguenther@suse.de>
 
        Backport from mainline
index 8e63249d4ba95d86b607fe289e1fb526ec34d5b5..f7c538c4d54eea5b18ef51e76103c8aa33e2953f 100644 (file)
@@ -7047,18 +7047,25 @@ rs6000_adjust_vec_address (rtx scalar_reg,
     element_offset = GEN_INT (INTVAL (element) * scalar_size);
   else
     {
+      /* Mask the element to make sure the element number is between 0 and the
+        maximum number of elements - 1 so that we don't generate an address
+        outside the vector.  */
+      rtx num_ele_m1 = GEN_INT (GET_MODE_NUNITS (GET_MODE (mem)) - 1);
+      rtx and_op = gen_rtx_AND (Pmode, element, num_ele_m1);
+      emit_insn (gen_rtx_SET (base_tmp, and_op));
+
       int byte_shift = exact_log2 (scalar_size);
       gcc_assert (byte_shift >= 0);
 
       if (byte_shift == 0)
-       element_offset = element;
+       element_offset = base_tmp;
 
       else
        {
          if (TARGET_POWERPC64)
-           emit_insn (gen_ashldi3 (base_tmp, element, GEN_INT (byte_shift)));
+           emit_insn (gen_ashldi3 (base_tmp, base_tmp, GEN_INT (byte_shift)));
          else
-           emit_insn (gen_ashlsi3 (base_tmp, element, GEN_INT (byte_shift)));
+           emit_insn (gen_ashlsi3 (base_tmp, base_tmp, GEN_INT (byte_shift)));
 
          element_offset = base_tmp;
        }