tree-optimization/97897 - complex lowering on abnormal edges
authorRichard Biener <rguenther@suse.de>
Thu, 19 Nov 2020 08:06:50 +0000 (09:06 +0100)
committerRichard Biener <rguenther@suse.de>
Thu, 19 Nov 2020 08:57:38 +0000 (09:57 +0100)
This fixes complex lowering to not put constants into abnormal
edge PHI values by making sure abnormally used SSA names are
VARYING in its propagation lattice.

2020-11-19  Richard Biener  <rguenther@suse.de>

PR tree-optimization/97897
* tree-complex.c (complex_propagate::visit_stmt): Make sure
abnormally used SSA names are VARYING.
(complex_propagate::visit_phi): Likewise.
* tree-ssa.c (verify_phi_args): Verify PHI arguments on abnormal
edges are SSA names.

* gcc.dg/pr97897.c: New testcase.

gcc/testsuite/gcc.dg/pr97897.c [new file with mode: 0644]
gcc/tree-complex.c
gcc/tree-ssa.c

diff --git a/gcc/testsuite/gcc.dg/pr97897.c b/gcc/testsuite/gcc.dg/pr97897.c
new file mode 100644 (file)
index 0000000..775f34c
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+void h ();
+void f () __attribute__ ((returns_twice));
+void g (_Complex int a)
+{
+  f ();
+  if (a != 0)
+  {
+    a = 0;
+    h ();
+  }
+}
index f132e0f41c76d19d4c02f811bb048e831d6ee90a..1cfb3e8d743f8eafc188fd08d08d5a548bc23b8a 100644 (file)
@@ -318,7 +318,7 @@ complex_propagate::visit_stmt (gimple *stmt, edge *taken_edge_p ATTRIBUTE_UNUSED
 
   lhs = gimple_get_lhs (stmt);
   /* Skip anything but GIMPLE_ASSIGN and GIMPLE_CALL with a lhs.  */
-  if (!lhs)
+  if (!lhs || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
     return SSA_PROP_VARYING;
 
   /* These conditions should be satisfied due to the initial filter
@@ -417,6 +417,9 @@ complex_propagate::visit_phi (gphi *phi)
      set up in init_dont_simulate_again.  */
   gcc_assert (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE);
 
+  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
+    return SSA_PROP_VARYING;
+
   /* We've set up the lattice values such that IOR neatly models PHI meet.  */
   new_l = UNINITIALIZED;
   for (i = gimple_phi_num_args (phi) - 1; i >= 0; --i)
index c47b963bbb2ff4fbcbb37a18ac5170bd4edba173..b44361f824426f131d195b8d4de41741e64384dc 100644 (file)
@@ -987,6 +987,12 @@ verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
          err = true;
        }
 
+      if ((e->flags & EDGE_ABNORMAL) && TREE_CODE (op) != SSA_NAME)
+       {
+         error ("PHI argument on abnormal edge is not SSA_NAME");
+         err = true;
+       }
+
       if (TREE_CODE (op) == SSA_NAME)
        {
          err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));