]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[aarch64] PR target/91386 Use copy_rtx to avoid modifying original insns in peep2...
authorRichard Earnshaw <rearnsha@arm.com>
Mon, 19 Aug 2019 16:11:30 +0000 (16:11 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Mon, 19 Aug 2019 16:11:30 +0000 (16:11 +0000)
PR target/91386 is a situation where a peephole2 pattern substitution
is discarded late because the selected instructions contain
frame-related notes that we cannot redistribute (because the pattern
has more than one insn in the output).  Unfortunately, the original
insns were being modified during the generation, so after the undo we
are left with corrupt RTL.

We avoid this by ensuring that the modifications are always made on a
copy, so that the original insns are never changed.

Backport from mainline
2019-09-09  Richard Earnshaw  <rearnsha@arm.com>

PR target/91386
        * config/aarch64/aarch64.c (aarch64_gen_adjusted_ldpstp): Use copy_rtx
        to preserve the contents of the original insns.

From-SVN: r274675

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index 2d2fa9425030705d37850ddb8ac2b18c64474e77..a8c9938c5d63c01bbcc6f727bc6619f70e9624ef 100644 (file)
@@ -1,3 +1,12 @@
+2019-08-19  Richard Earnshaw  <rearnsha@arm.com>
+
+       Backport from mainline
+       2019-09-09  Richard Earnshaw  <rearnsha@arm.com>
+
+       PR target/91386
+       * config/aarch64/aarch64.c (aarch64_gen_adjusted_ldpstp): Use copy_rtx
+       to preserve the contents of the original insns.
+
 2019-08-16  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        Backport from mainline
index 6b25d9cbfaec42bed5198a50a1766315bcbf18ff..82e9b1fbfd8526f57554a82fe2621acc9a9df020 100644 (file)
@@ -18162,19 +18162,21 @@ aarch64_gen_adjusted_ldpstp (rtx *operands, bool load,
   /* Sort the operands.  */
   qsort (temp_operands, 4, 2 * sizeof (rtx *), aarch64_ldrstr_offset_compare);
 
+  /* Copy the memory operands so that if we have to bail for some
+     reason the original addresses are unchanged.  */
   if (load)
     {
-      mem_1 = temp_operands[1];
-      mem_2 = temp_operands[3];
-      mem_3 = temp_operands[5];
-      mem_4 = temp_operands[7];
+      mem_1 = copy_rtx (temp_operands[1]);
+      mem_2 = copy_rtx (temp_operands[3]);
+      mem_3 = copy_rtx (temp_operands[5]);
+      mem_4 = copy_rtx (temp_operands[7]);
     }
   else
     {
-      mem_1 = temp_operands[0];
-      mem_2 = temp_operands[2];
-      mem_3 = temp_operands[4];
-      mem_4 = temp_operands[6];
+      mem_1 = copy_rtx (temp_operands[0]);
+      mem_2 = copy_rtx (temp_operands[2]);
+      mem_3 = copy_rtx (temp_operands[4]);
+      mem_4 = copy_rtx (temp_operands[6]);
       gcc_assert (code == UNKNOWN);
     }