[PR97701] LRA: Don't narrow class only for REG or MEM.
authorVladimir N. Makarov <vmakarov@redhat.com>
Fri, 29 Jan 2021 16:51:44 +0000 (11:51 -0500)
committerVladimir N. Makarov <vmakarov@redhat.com>
Fri, 29 Jan 2021 19:54:41 +0000 (14:54 -0500)
Reload pseudos of ALL_REGS class did not narrow class from constraint
in insn (set (pseudo) (lo_sum ...)) because lo_sum is considered an
object (OBJECT_P) although the insn is not a classic move.  To permit
narrowing we are starting to use MEM_P and REG_P instead of OBJECT_P.

gcc/ChangeLog:

PR target/97701
* lra-constraints.c (in_class_p): Don't narrow class only for REG
or MEM.

gcc/testsuite/ChangeLog:

PR target/97701
* gcc.target/aarch64/pr97701.c: New.

gcc/lra-constraints.c
gcc/testsuite/gcc.target/aarch64/pr97701.c [new file with mode: 0644]

index d716ee48e51a89b18e968fac09ac6b34270df053..e739a466a0de94ffefa2922e8409302607e29842 100644 (file)
@@ -250,6 +250,7 @@ in_class_p (rtx reg, enum reg_class cl, enum reg_class *new_class,
 {
   enum reg_class rclass, common_class;
   machine_mode reg_mode;
+  rtx src;
   int class_size, hard_regno, nregs, i, j;
   int regno = REGNO (reg);
 
@@ -265,6 +266,7 @@ in_class_p (rtx reg, enum reg_class cl, enum reg_class *new_class,
     }
   reg_mode = GET_MODE (reg);
   rclass = get_reg_class (regno);
+  src = curr_insn_set != NULL ? SET_SRC (curr_insn_set) : NULL;
   if (regno < new_regno_start
       /* Do not allow the constraints for reload instructions to
         influence the classes of new pseudos.  These reloads are
@@ -273,12 +275,10 @@ in_class_p (rtx reg, enum reg_class cl, enum reg_class *new_class,
         where other reload pseudos are no longer allocatable.  */
       || (!allow_all_reload_class_changes_p
          && INSN_UID (curr_insn) >= new_insn_uid_start
-         && curr_insn_set != NULL
-         && ((OBJECT_P (SET_SRC (curr_insn_set))
-              && ! CONSTANT_P (SET_SRC (curr_insn_set)))
-             || (GET_CODE (SET_SRC (curr_insn_set)) == SUBREG
-                 && OBJECT_P (SUBREG_REG (SET_SRC (curr_insn_set)))
-                 && ! CONSTANT_P (SUBREG_REG (SET_SRC (curr_insn_set)))))))
+         && src != NULL
+         && ((REG_P (src) || MEM_P (src))
+             || (GET_CODE (src) == SUBREG
+                 && (REG_P (SUBREG_REG (src)) || MEM_P (SUBREG_REG (src)))))))
     /* When we don't know what class will be used finally for reload
        pseudos, we use ALL_REGS.  */
     return ((regno >= new_regno_start && rclass == ALL_REGS)
diff --git a/gcc/testsuite/gcc.target/aarch64/pr97701.c b/gcc/testsuite/gcc.target/aarch64/pr97701.c
new file mode 100644 (file)
index 0000000..ede3540
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+extern char a[][12][18][17][17];
+extern short b[][12][18][17][17];
+extern int c[][2][8][7];
+short *d;
+void e(signed f, int g, char h, char i, char j) {
+  for (int k = 648; k; k += f)
+    for (short l; l < j; l += 9)
+      for (long m = f + 6LL; m < (h ? h : i); m += 2)
+        for (int n = 0; n < 16; n += 3LL) {
+          for (int o = g; o; o++)
+            a[k][l][m][n][o] = b[k][l][m][n][o] = d[k] ? 2 : 0;
+          c[k][l][m][0] = 0;
+        }
+}