]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ira: Make sure allocno copies are ordered [PR98791]
authorAndre Vieira <andre.simoesdiasvieira@arm.com>
Mon, 22 Feb 2021 13:41:46 +0000 (13:41 +0000)
committerAndre Vieira <andre.simoesdiasvieira@arm.com>
Mon, 15 Mar 2021 11:17:55 +0000 (11:17 +0000)
gcc/ChangeLog:
2021-02-22  Andre Vieira  <andre.simoesdiasvieira@arm.com>

PR rtl-optimization/98791
* ira-conflicts.c (process_regs_for_copy): Don't create allocno copies
for unordered modes.

gcc/testsuite/ChangeLog:
2021-02-22  Andre Vieira  <andre.simoesdiasvieira@arm.com>

PR rtl-optimization/98791
* gcc.target/aarch64/sve/pr98791.c: New test.

(cherry picked from commit 4c31a3a6d31b6214ea774d403bf8ab7ebe1ea862)

gcc/ira-conflicts.c
gcc/testsuite/gcc.target/aarch64/sve/pr98791.c [new file with mode: 0644]

index 0220e725e555aa8fa1caf7bdce878289d3317118..5122b90a9aaa8946c6f04367005127e1ee92ae53 100644 (file)
@@ -275,7 +275,10 @@ process_regs_for_copy (rtx reg1, rtx reg2, bool constraint_p,
       ira_allocno_t a1 = ira_curr_regno_allocno_map[REGNO (reg1)];
       ira_allocno_t a2 = ira_curr_regno_allocno_map[REGNO (reg2)];
 
-      if (!allocnos_conflict_for_copy_p (a1, a2) && offset1 == offset2)
+      if (!allocnos_conflict_for_copy_p (a1, a2)
+         && offset1 == offset2
+         && ordered_p (GET_MODE_PRECISION (ALLOCNO_MODE (a1)),
+                       GET_MODE_PRECISION (ALLOCNO_MODE (a2))))
        {
          cp = ira_add_allocno_copy (a1, a2, freq, constraint_p, insn,
                                     ira_curr_loop_tree_node);
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr98791.c b/gcc/testsuite/gcc.target/aarch64/sve/pr98791.c
new file mode 100644 (file)
index 0000000..cc1f183
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR rtl-optimization/98791  */
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-vectorize" } */
+#include <arm_sve.h>
+extern char a[11];
+extern long b[];
+void f() {
+  for (int d; d < 10; d++) {
+    a[d] = svaddv(svptrue_b8(), svdup_u8(0));
+    b[d] = 0;
+  }
+}