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.
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))
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))
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))
break;
case CT_MEMORY:
+ case CT_RELAXED_MEMORY:
if (MEM_P (op)
&& satisfies_memory_constraint_p (op, cn))
win = true;
break;
case CT_SPECIAL_MEMORY:
- case CT_RELAXED_MEMORY:
if (satisfies_memory_constraint_p (op, cn))
win = true;
else if (spilled_pseudo_p (op))
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);
break;
case CT_MEMORY:
+ case CT_RELAXED_MEMORY:
if (force_reload)
break;
if (constraint_satisfied_p (operand, cn))
break;
case CT_SPECIAL_MEMORY:
- case CT_RELAXED_MEMORY:
if (force_reload)
break;
if (constraint_satisfied_p (operand, cn))
--- /dev/null
+/* { 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;
+ }
+ }
+}