diff mbox series

[committed] early-remat: Handle sets of multiple candidate regs [PR94605]

Message ID mpt8sivocov.fsf@arm.com
State New
Headers show
Series [committed] early-remat: Handle sets of multiple candidate regs [PR94605] | expand

Commit Message

Richard Sandiford April 16, 2020, 12:08 p.m. UTC
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.

Tested on aarch64-linux-gnu, aarch64_be-elf and x86_64-linux-gnu.
Pushed as obvious.  I'll backport to GCC 9 and 8 too.

Richard


2020-04-16  Richard Sandiford  <richard.sandiford@arm.com>

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.
---
 gcc/early-remat.c                              |  2 +-
 gcc/testsuite/gcc.target/aarch64/sve/pr94605.c | 12 ++++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr94605.c
diff mbox series

Patch

diff --git a/gcc/early-remat.c b/gcc/early-remat.c
index 80672cca241..9f5f8541644 100644
--- a/gcc/early-remat.c
+++ b/gcc/early-remat.c
@@ -2020,7 +2020,7 @@  early_remat::process_block (basic_block bb)
 	}
 
       /* Now process definitions.  */
-      if (next_def && insn == next_def->insn)
+      while (next_def && insn == next_def->insn)
 	{
 	  unsigned int gen = canon_candidate (next_candidate);
 
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr94605.c b/gcc/testsuite/gcc.target/aarch64/sve/pr94605.c
new file mode 100644
index 00000000000..593e959e292
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/sve/pr94605.c
@@ -0,0 +1,12 @@ 
+/* { 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));
+}