re PR tree-optimization/77286 (ICE in fold_convert_loc, at fold-const.c:2248 building...
authorRichard Biener <rguenther@suse.de>
Tue, 23 Aug 2016 13:58:19 +0000 (13:58 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 23 Aug 2016 13:58:19 +0000 (13:58 +0000)
2016-08-23  Richard Biener  <rguenther@suse.de>

PR tree-optimization/77286
* tree-vect-loop.c (vect_analyze_loop_form_1): Do not modify
the CFG here.
(vect_transform_loop): Split exit edges of loop and scalar
loop if required and at the appropriate time.

From-SVN: r239700

gcc/ChangeLog
gcc/tree-vect-loop.c

index 23cf5bc33cf3ec322aface2bc4763968f14e8118..5cf4158a6287ae3a7dde9046e84bfbf0917d892c 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-23  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/77286
+       * tree-vect-loop.c (vect_analyze_loop_form_1): Do not modify
+       the CFG here.
+       (vect_transform_loop): Split exit edges of loop and scalar
+       loop if required and at the appropriate time.
+
 2016-08-23  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
        * explow.c (get_dynamic_stack_size): Take known alignment of stack
index c9ba5810e708154a3f7eb2d3c02daea0a30db281..fa06505d1f228279cf7ec8d4f597687cd432722b 100644 (file)
@@ -1486,23 +1486,14 @@ vect_analyze_loop_form_1 (struct loop *loop, gcond **loop_cond,
       return false;
     }
 
-  /* Make sure there exists a single-predecessor exit bb:  */
-  if (!single_pred_p (single_exit (loop)->dest))
+  /* Make sure the exit is not abnormal.  */
+  edge e = single_exit (loop);
+  if (e->flags & EDGE_ABNORMAL)
     {
-      edge e = single_exit (loop);
-      if (!(e->flags & EDGE_ABNORMAL))
-       {
-         split_loop_exit_edge (e);
-         if (dump_enabled_p ())
-           dump_printf (MSG_NOTE, "split exit edge.\n");
-       }
-      else
-       {
-         if (dump_enabled_p ())
-           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
-                            "not vectorized: abnormal loop exit edge.\n");
-         return false;
-       }
+      if (dump_enabled_p ())
+       dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                        "not vectorized: abnormal loop exit edge.\n");
+      return false;
     }
 
   *loop_cond = vect_get_loop_niters (loop, assumptions, number_of_iterations,
@@ -6759,6 +6750,16 @@ vect_transform_loop (loop_vec_info loop_vinfo)
       check_profitability = true;
     }
 
+  /* Make sure there exists a single-predecessor exit bb.  Do this before 
+     versioning.   */
+  edge e = single_exit (loop);
+  if (! single_pred_p (e->dest))
+    {
+      split_loop_exit_edge (e);
+      if (dump_enabled_p ())
+       dump_printf (MSG_NOTE, "split exit edge\n");
+    }
+
   /* Version the loop first, if required, so the profitability check
      comes first.  */
 
@@ -6768,6 +6769,22 @@ vect_transform_loop (loop_vec_info loop_vinfo)
       check_profitability = false;
     }
 
+  /* Make sure there exists a single-predecessor exit bb also on the
+     scalar loop copy.  Do this after versioning but before peeling
+     so CFG structure is fine for both scalar and if-converted loop
+     to make slpeel_duplicate_current_defs_from_edges face matched
+     loop closed PHI nodes on the exit.  */
+  if (LOOP_VINFO_SCALAR_LOOP (loop_vinfo))
+    {
+      e = single_exit (LOOP_VINFO_SCALAR_LOOP (loop_vinfo));
+      if (! single_pred_p (e->dest))
+       {
+         split_loop_exit_edge (e);
+         if (dump_enabled_p ())
+           dump_printf (MSG_NOTE, "split exit edge of scalar loop\n");
+       }
+    }
+
   tree ni_name = vect_build_loop_niters (loop_vinfo);
   LOOP_VINFO_NITERS_UNCHANGED (loop_vinfo) = ni_name;