aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir N. Makarov <vmakarov@redhat.com>2021-01-29 11:51:44 -0500
committerVladimir N. Makarov <vmakarov@redhat.com>2021-01-29 14:54:41 -0500
commit7f9f83ef300e8734dccb90a7c347997b2787e9e9 (patch)
tree55c36a274feef77806287dc0a394bcd0c4bb41a2 /gcc
parent726b7aa004d6885388a76521222602b8552a41ee (diff)
downloadgcc-7f9f83ef300e8734dccb90a7c347997b2787e9e9.zip
gcc-7f9f83ef300e8734dccb90a7c347997b2787e9e9.tar.gz
gcc-7f9f83ef300e8734dccb90a7c347997b2787e9e9.tar.bz2
[PR97701] LRA: Don't narrow class only for REG or MEM.
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/lra-constraints.c12
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr97701.c17
2 files changed, 23 insertions, 6 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index d716ee4..e739a46 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -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
index 0000000..ede3540
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr97701.c
@@ -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;
+ }
+}