aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2021-03-26 17:09:24 +0000
committerVladimir Makarov <vmakarov@redhat.com>2021-03-26 17:11:30 +0000
commit0d37e2d3ead072ba57e03fcb97a041504a22e721 (patch)
tree01956ec203c173039a8d1838fcd6c724f1db6cab /gcc
parent6b8b0c8e243bdc122a9ddd42030275494b1148ff (diff)
downloadgcc-0d37e2d3ead072ba57e03fcb97a041504a22e721.zip
gcc-0d37e2d3ead072ba57e03fcb97a041504a22e721.tar.gz
gcc-0d37e2d3ead072ba57e03fcb97a041504a22e721.tar.bz2
[PR99766] Consider relaxed memory associated more with memory instead of special memory.
Relaxed memory should be considered more like memory then special memory. gcc/ChangeLog: PR target/99766 * ira-costs.c (record_reg_classes): Put case with CT_RELAXED_MEMORY adjacent to one with CT_MEMORY. * ira.c (ira_setup_alts): Ditto. * lra-constraints.c (process_alt_operands): Ditto. * recog.c (asm_operand_ok): Ditto. * reload.c (find_reloads): Ditto. gcc/testsuite/ChangeLog: PR target/99766 * g++.target/aarch64/sve/pr99766.C: New.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ira-costs.c2
-rw-r--r--gcc/ira.c2
-rw-r--r--gcc/lra-constraints.c2
-rw-r--r--gcc/recog.c2
-rw-r--r--gcc/reload.c2
-rw-r--r--gcc/testsuite/g++.target/aarch64/sve/pr99766.C24
6 files changed, 29 insertions, 5 deletions
diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c
index 7547f3e..10727b5 100644
--- a/gcc/ira-costs.c
+++ b/gcc/ira-costs.c
@@ -773,6 +773,7 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
break;
case CT_MEMORY:
+ case CT_RELAXED_MEMORY:
/* Every MEM can be reloaded to fit. */
insn_allows_mem[i] = allows_mem[i] = 1;
if (MEM_P (op))
@@ -780,7 +781,6 @@ record_reg_classes (int n_alts, int n_ops, rtx *ops,
break;
case CT_SPECIAL_MEMORY:
- case CT_RELAXED_MEMORY:
insn_allows_mem[i] = allows_mem[i] = 1;
if (MEM_P (extract_mem_from_operand (op))
&& constraint_satisfied_p (op, cn))
diff --git a/gcc/ira.c b/gcc/ira.c
index 7e90328..b93588d 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -1871,10 +1871,10 @@ ira_setup_alts (rtx_insn *insn)
goto op_success;
case CT_MEMORY:
+ case CT_RELAXED_MEMORY:
mem = op;
/* Fall through. */
case CT_SPECIAL_MEMORY:
- case CT_RELAXED_MEMORY:
if (!mem)
mem = extract_mem_from_operand (op);
if (MEM_P (mem))
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 861b5aa..9993065 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -2417,6 +2417,7 @@ process_alt_operands (int only_alternative)
break;
case CT_MEMORY:
+ case CT_RELAXED_MEMORY:
if (MEM_P (op)
&& satisfies_memory_constraint_p (op, cn))
win = true;
@@ -2459,7 +2460,6 @@ process_alt_operands (int only_alternative)
break;
case CT_SPECIAL_MEMORY:
- case CT_RELAXED_MEMORY:
if (satisfies_memory_constraint_p (op, cn))
win = true;
else if (spilled_pseudo_p (op))
diff --git a/gcc/recog.c b/gcc/recog.c
index ee143bc..eb617f1 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -2267,10 +2267,10 @@ asm_operand_ok (rtx op, const char *constraint, const char **constraints)
break;
case CT_MEMORY:
+ case CT_RELAXED_MEMORY:
mem = op;
/* Fall through. */
case CT_SPECIAL_MEMORY:
- case CT_RELAXED_MEMORY:
/* Every memory operand can be reloaded to fit. */
if (!mem)
mem = extract_mem_from_operand (op);
diff --git a/gcc/reload.c b/gcc/reload.c
index 7340125..461fd02 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -3471,6 +3471,7 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known,
break;
case CT_MEMORY:
+ case CT_RELAXED_MEMORY:
if (force_reload)
break;
if (constraint_satisfied_p (operand, cn))
@@ -3504,7 +3505,6 @@ find_reloads (rtx_insn *insn, int replace, int ind_levels, int live_known,
break;
case CT_SPECIAL_MEMORY:
- case CT_RELAXED_MEMORY:
if (force_reload)
break;
if (constraint_satisfied_p (operand, cn))
diff --git a/gcc/testsuite/g++.target/aarch64/sve/pr99766.C b/gcc/testsuite/g++.target/aarch64/sve/pr99766.C
new file mode 100644
index 0000000..0ca8aee
--- /dev/null
+++ b/gcc/testsuite/g++.target/aarch64/sve/pr99766.C
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3 -march=armv8.2-a+sve" } */
+typedef float a __attribute__((__mode__(HF)));
+typedef struct {
+ a b;
+ a c;
+} d;
+int e;
+d *f, *g;
+__fp16 h;
+void j() {
+ for (int i;; ++i) {
+ auto l = &f[i];
+ for (int k; k < e;) {
+ k = 0;
+ for (; k < e; ++k)
+ g[k].b = l[k].b * l[k].c;
+ }
+ for (int k; k < e; ++k) {
+ g[k].b *= h;
+ g[k].c *= h;
+ }
+ }
+}