re PR tree-optimization/79034 (error: missing PHI def in verify_gimple_in_cfg)
authorRichard Biener <rguenther@suse.de>
Tue, 10 Jan 2017 14:50:32 +0000 (14:50 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 10 Jan 2017 14:50:32 +0000 (14:50 +0000)
2016-01-10  Richard Biener  <rguenther@suse.de>

PR tree-optimization/79034
* tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds):
Propagate out degenerate PHIs in the joiner.

* g++.dg/torture/pr79034.C: New testcase.

From-SVN: r244274

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr79034.C [new file with mode: 0644]
gcc/tree-call-cdce.c

index ab86ebd936ae1b916414e5be868827377f898cc1..23b5fc721096e18e29da7c91a064802e3c7dc49d 100644 (file)
@@ -1,3 +1,9 @@
+2016-01-10  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/79034
+       * tree-call-cdce.c (shrink_wrap_one_built_in_call_with_conds):
+       Propagate out degenerate PHIs in the joiner.
+
 2017-01-10  Martin Liska  <mliska@suse.cz>
 
        * ipa-icf.c (sort_sem_items_by_decl_uid): New function.
index ecbc8fabadc6743ba9b83cdfe7f2108861827234..bc86b4f37de3d569ca9594e03f5a963c5318bdeb 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-10  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/79034
+       * g++.dg/torture/pr79034.C: New testcase.
+
 2017-01-10  Martin Liska  <mliska@suse.cz>
 
        * gcc.dg/ipa/ipa-icf-1.c: Change scanned pattern.
diff --git a/gcc/testsuite/g++.dg/torture/pr79034.C b/gcc/testsuite/g++.dg/torture/pr79034.C
new file mode 100644 (file)
index 0000000..802c0aa
--- /dev/null
@@ -0,0 +1,52 @@
+/* { dg-do compile } */
+
+extern "C" {
+    float sqrtf(float);
+}
+
+class T {
+public:
+    float floats[1];
+
+    inline float length() const {
+       return sqrtf(floats[0]);
+    }
+};
+
+void destruct(void *);
+
+class Container {
+
+    T Ts[1];
+
+public:
+    ~Container() {
+       destruct((void *)Ts);
+    }
+
+    T& operator[](int n) {
+       return Ts[0];
+    }
+};
+
+void fill(Container&);
+
+void doit()
+{
+  Container data;
+  float max = 10;
+
+  int i, j, k;
+
+  for (i = 0; i < 10; i++) {
+      for (j = 1; j < 10; j++) {
+         if (max < 5)
+           break;
+         fill( data);
+         max = data[0].length();
+         for (k = 1; k < j; k++) {
+             max = 5;
+         }
+      }
+  }
+}
index e66830449f39bd082751d3f3590cab4d02cf1bf1..10d2c47ee78e6a49bb394132aa8044839aea9069 100644 (file)
@@ -811,7 +811,18 @@ shrink_wrap_one_built_in_call_with_conds (gcall *bi_call, vec <gimple *> conds,
       if (EDGE_COUNT (join_tgt_in_edge_from_call->dest->preds) > 1)
        join_tgt_bb = split_edge (join_tgt_in_edge_from_call);
       else
-       join_tgt_bb = join_tgt_in_edge_from_call->dest;
+       {
+         join_tgt_bb = join_tgt_in_edge_from_call->dest;
+         /* We may have degenerate PHIs in the destination.  Propagate
+            those out.  */
+         for (gphi_iterator i = gsi_start_phis (join_tgt_bb); !gsi_end_p (i);)
+           {
+             gphi *phi = i.phi ();
+             replace_uses_by (gimple_phi_result (phi),
+                              gimple_phi_arg_def (phi, 0));
+             remove_phi_node (&i, true);
+           }
+       }
     }
   else
     {