if-to-switch: fix also virtual phis
authorMartin Liska <mliska@suse.cz>
Tue, 12 Jan 2021 12:40:44 +0000 (13:40 +0100)
committerMartin Liska <mliska@suse.cz>
Wed, 13 Jan 2021 10:33:28 +0000 (11:33 +0100)
gcc/ChangeLog:

PR tree-optimization/98455
* gimple-if-to-switch.cc (condition_info::record_phi_mapping):
Record also virtual PHIs.
(pass_if_to_switch::execute): Return TODO_cleanup_cfg only
conditionally.

gcc/testsuite/ChangeLog:

PR tree-optimization/98455
* gcc.dg/tree-ssa/pr98455.c: New test.

gcc/gimple-if-to-switch.cc
gcc/testsuite/gcc.dg/tree-ssa/pr98455.c [new file with mode: 0644]

index 560753d0311850cea893f4680493bd46a7767c3f..1712fc4c8b3da40e83df6e200bfdbcc626e41df8 100644 (file)
@@ -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));
     }
 }
 
@@ -470,7 +467,7 @@ const pass_data pass_data_if_to_switch =
   0, /* properties_provided */
   0, /* properties_destroyed */
   0, /* todo_flags_start */
-  TODO_cleanup_cfg | TODO_update_ssa /* todo_flags_finish */
+  TODO_update_ssa /* todo_flags_finish */
 };
 
 class pass_if_to_switch : public gimple_opt_pass
@@ -575,7 +572,7 @@ pass_if_to_switch::execute (function *fun)
   if (!all_candidates.is_empty ())
     {
       free_dominance_info (CDI_DOMINATORS);
-      mark_virtual_operands_for_renaming (fun);
+      return TODO_cleanup_cfg;
     }
 
   return 0;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98455.c b/gcc/testsuite/gcc.dg/tree-ssa/pr98455.c
new file mode 100644 (file)
index 0000000..24e249f
--- /dev/null
@@ -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;
+}