Hi, PR97777 - ICE: in df_refs_verify, at df-scan.c:3991 with -O -ffinite-math-only -fzero-call-used-regs=all
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97777 Is a bug triggered by the new pass zero-call-used-regs, however, it’s an old bug in the pass “reg-stack”. This pass does not correctly maintain the df information after transformation. Since the transformation is reg-stack pass is quite complicate, involving both instruction changes and control Flow changes, I called “df_insn_rescan_all” after the transformation is done. The patch has been tested with bootstrap with --enable-checking=yes,rtl,df,extra, no regression. Okay for commit? Qing From c2573c6c8552b7b4c2eedb0684ce48b5c11436ec Mon Sep 17 00:00:00 2001 From: qing zhao <qinz...@gcc.gnu.org> Date: Thu, 19 Nov 2020 16:46:50 +0100 Subject: [PATCH] rtl-optimization: Fix data flow maintenance bug in reg-stack.c [pr97777] reg-stack pass does not maintain the data flow information correctly. call df_insn_rescan_all after the transformation is done. gcc/ PR rtl-optimization/97777 * reg-stack.c (rest_of_handle_stack_regs): call df_insn_rescan_all if reg_to_stack return true. gcc/testsuite/ PR rtl-optimization/97777 * gcc.target/i386/pr97777.c: New test. --- gcc/reg-stack.c | 3 ++- gcc/testsuite/gcc.target/i386/pr97777.c | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr97777.c diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index 8f98bd85750..3dab843f803 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -3426,7 +3426,8 @@ static unsigned int rest_of_handle_stack_regs (void) { #ifdef STACK_REGS - reg_to_stack (); + if (reg_to_stack ()) + df_insn_rescan_all (); regstack_completed = 1; #endif return 0; diff --git a/gcc/testsuite/gcc.target/i386/pr97777.c b/gcc/testsuite/gcc.target/i386/pr97777.c new file mode 100644 index 00000000000..fcefc098637 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr97777.c @@ -0,0 +1,9 @@ +/* { dg-do compile { target *-*-linux* } } */ +/* { dg-options "-O -fzero-call-used-regs=used -ffinite-math-only" } */ + +float +foo (void) +{ + return __builtin_fmod (0, 0); +} + -- 2.11.0