early-remat.c:process_block wasn't handling insns that set multiple
candidate registers, which led to an assertion failure at the end
of the main loop.
Instructions that set two pseudos aren't rematerialisation candidates in
themselves, but we still need to track them if another instruction that
sets the same register is a rematerialisation candidate.
gcc/
PR rtl-optimization/94605
* early-remat.c (early_remat::process_block): Handle insns that
set multiple candidate registers.
gcc/testsuite/
PR rtl-optimization/94605
* gcc.target/aarch64/sve/pr94605.c: New test.
(cherry picked from commit
3c3f12e2a7625c9a2f5d74a47dbacb2fd1ae5643)
}
/* Now process definitions. */
- if (next_def && insn == next_def->insn)
+ while (next_def && insn == next_def->insn)
{
unsigned int gen = canon_candidate (next_candidate);
--- /dev/null
+/* { dg-options "-O2 -msve-vector-bits=256" } */
+
+typedef int v8si __attribute__((vector_size(32)));
+int g (v8si, v8si);
+
+void
+f (void)
+{
+ v8si x = {}, y = {};
+ while (g (x, y))
+ asm ("" : "+w" (x), "+w" (y));
+}