]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/70725 (Internal compiler error (ICE) on valid code)
authorRichard Biener <rguenther@suse.de>
Thu, 21 Apr 2016 14:09:33 +0000 (14:09 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 21 Apr 2016 14:09:33 +0000 (14:09 +0000)
2016-04-21  Richard Biener  <rguenther@suse.de>

PR tree-optimization/70725
* tree-if-conv.c (if_convertible_phi_p): Adjust guard
for phi_convertible_by_degenerating_args.
(predicate_all_scalar_phis): Handle single-argument PHIs.

From-SVN: r235341

gcc/ChangeLog
gcc/tree-if-conv.c

index 50d13cb2fe3500ff5a96ac4b4a0f9aaf9f20ae24..4ad22d8fce68644a62b983f550f318cae83a8b09 100644 (file)
@@ -1,3 +1,10 @@
+2016-04-21  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/70725
+       * tree-if-conv.c (if_convertible_phi_p): Adjust guard
+       for phi_convertible_by_degenerating_args.
+       (predicate_all_scalar_phis): Handle single-argument PHIs.
+
 2016-04-21  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/70747
index 04a1d3e536db27591c09f7e3d785358e5bd5895c..2d14901316ef18715e569bf9f21832a137e58a6e 100644 (file)
@@ -659,7 +659,7 @@ if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi,
 
   if (bb != loop->header)
     {
-      if (gimple_phi_num_args (phi) != 2
+      if (gimple_phi_num_args (phi) > 2
          && !aggressive_if_conv
          && !phi_convertible_by_degenerating_args (phi))
        {
@@ -1911,20 +1911,31 @@ predicate_all_scalar_phis (struct loop *loop)
       if (bb == loop->header)
        continue;
 
-      if (EDGE_COUNT (bb->preds) == 1)
-       continue;
-
       phi_gsi = gsi_start_phis (bb);
       if (gsi_end_p (phi_gsi))
        continue;
 
-      gsi = gsi_after_labels (bb);
-      while (!gsi_end_p (phi_gsi))
+      if (EDGE_COUNT (bb->preds) == 1)
        {
-         phi = phi_gsi.phi ();
-         predicate_scalar_phi (phi, &gsi);
-         release_phi_node (phi);
-         gsi_next (&phi_gsi);
+         /* Propagate degenerate PHIs.  */
+         for (phi_gsi = gsi_start_phis (bb); !gsi_end_p (phi_gsi);
+              gsi_next (&phi_gsi))
+           {
+             gphi *phi = phi_gsi.phi ();
+             replace_uses_by (gimple_phi_result (phi),
+                              gimple_phi_arg_def (phi, 0));
+           }
+       }
+      else
+       {
+         gsi = gsi_after_labels (bb);
+         while (!gsi_end_p (phi_gsi))
+           {
+             phi = phi_gsi.phi ();
+             predicate_scalar_phi (phi, &gsi);
+             release_phi_node (phi);
+             gsi_next (&phi_gsi);
+           }
        }
 
       set_phi_nodes (bb, NULL);