Hello.

As seen in the PR, we need to fix also virtual PHIs, otherwise
TODO_cfg will skip edges for a missing PHI argument.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

        PR tree-optimization/98455
        * gimple-if-to-switch.cc (condition_info::record_phi_mapping):
        Record also virtual PHIs.

gcc/testsuite/ChangeLog:

        PR tree-optimization/98455
        * gcc.dg/tree-ssa/pr98455.c: New test.
---
 gcc/gimple-if-to-switch.cc              |  7 ++-----
 gcc/testsuite/gcc.dg/tree-ssa/pr98455.c | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr98455.c

diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc
index 560753d0311..96213d86c28 100644
--- a/gcc/gimple-if-to-switch.cc
+++ b/gcc/gimple-if-to-switch.cc
@@ -91,11 +91,8 @@ condition_info::record_phi_mapping (edge e, mapping_vec *vec)
        gsi_next (&gsi))
     {
       gphi *phi = gsi.phi ();
-      if (!virtual_operand_p (gimple_phi_result (phi)))
-       {
-         tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e);
-         vec->safe_push (std::make_pair (phi, arg));
-       }
+      tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e);
+      vec->safe_push (std::make_pair (phi, arg));
     }
 }
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98455.c b/gcc/testsuite/gcc.dg/tree-ssa/pr98455.c
new file mode 100644
index 00000000000..24e249f6fcb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr98455.c
@@ -0,0 +1,19 @@
+/* PR tree-optimization/98455 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -fno-tree-dce --param case-values-threshold=1" } */
+
+void
+n4 (int io, int vb)
+{
+  double uc[2] = { 1.0, 2.0, };
+
+  if (io == 0)
+    uc[0] = 0.0;
+
+  for (;;)
+    if (io == 0)
+      if (vb == 0)
+        uc[0] = uc[1];
+      else if (vb == 1)
+        uc[1] = 0.0;
+}
--
2.29.2

Reply via email to