From cdb0af30f73923ec4355ecd5c294b7a026bb4aa4 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Fri, 7 Aug 2020 10:39:39 +0100 Subject: [PATCH] early-remat: Handle sets of multiple candidate regs [PR94605] 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) --- 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 --git a/gcc/early-remat.c b/gcc/early-remat.c index 122891c1edb5..712e39033f4e 100644 --- a/gcc/early-remat.c +++ b/gcc/early-remat.c @@ -1995,7 +1995,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 000000000000..593e959e292d --- /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)); +} -- 2.47.2