re PR tree-optimization/19951 (ICE in tree_split_edge, at tree-cfg.c:3199 with -ftree...
authorDorit Naishlos <dorit@il.ibm.com>
Sun, 20 Feb 2005 13:47:28 +0000 (13:47 +0000)
committerDorit Nuzman <dorit@gcc.gnu.org>
Sun, 20 Feb 2005 13:47:28 +0000 (13:47 +0000)
        PR tree-optimization/19951
        * tree-vect-analyze.c (vect_analyze_loop_form): Check if loop exit edge
        is abnormal.

From-SVN: r95301

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

index eb1a9be..4a059c9 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-20  Dorit Naishlos  <dorit@il.ibm.com>
+
+       PR tree-optimization/19951
+       * tree-vect-analyze.c (vect_analyze_loop_form): Check if loop exit edge
+       is abnormal.
+       
 2005-02-19  Steven Bosscher  <stevenb@suse.de>
 
        PR middle-end/19698 
index 7071199..fd26c90 100644 (file)
@@ -2312,17 +2312,32 @@ vect_analyze_loop_form (struct loop *loop)
     }
 
   /* Make sure we have a preheader basic block.  */
-  if (!loop->pre_header)
+  if (!loop->pre_header || EDGE_COUNT (loop->pre_header->succs) != 1)
     {
+      edge e = loop_preheader_edge (loop);
+      loop_split_edge_with (e, NULL);
+      if (vect_print_dump_info (REPORT_DETAILS, loop_loc))
+       fprintf (vect_dump, "split preheader edge.");
       rescan = true;
-      loop_split_edge_with (loop_preheader_edge (loop), NULL);
     }
     
   /* Make sure there exists a single-predecessor exit bb:  */
-  if (EDGE_COUNT (loop->exit_edges[0]->dest->preds) != 1)
+  if (EDGE_COUNT (loop->single_exit->dest->preds) != 1)
     {
-      rescan = true;
-      loop_split_edge_with (loop->exit_edges[0], NULL);
+      edge e = loop->single_exit;
+      if (!(e->flags & EDGE_ABNORMAL))
+       {
+         loop_split_edge_with (e, NULL);
+         if (vect_print_dump_info (REPORT_DETAILS, loop_loc))
+           fprintf (vect_dump, "split exit edge.");
+         rescan = true;
+       }
+      else
+       {
+         if (vect_print_dump_info (REPORT_BAD_FORM_LOOPS, loop_loc))
+           fprintf (vect_dump, "not vectorized: abnormal loop exit edge.");
+         return NULL;
+       }
     }
     
   if (rescan)