rtl-optimization: Fix data flow maintenance bug in reg-stack.c [pr97777]
authorqing zhao <qinzhao@gcc.gnu.org>
Wed, 2 Dec 2020 22:48:02 +0000 (23:48 +0100)
committerqing zhao <qinzhao@gcc.gnu.org>
Wed, 2 Dec 2020 22:48:02 +0000 (23:48 +0100)
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
gcc/testsuite/gcc.target/i386/pr97777.c [new file with mode: 0644]

index 8f98bd8..3dab843 100644 (file)
@@ -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 (file)
index 0000000..fcefc09
--- /dev/null
@@ -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);
+}
+