diff options
author | Dorit Naishlos <dorit@il.ibm.com> | 2005-02-20 13:47:28 +0000 |
---|---|---|
committer | Dorit Nuzman <dorit@gcc.gnu.org> | 2005-02-20 13:47:28 +0000 |
commit | ac59a959363d95d4bcb62231d545319166471fc3 (patch) | |
tree | 5d56727878f3d5d78be2d2dd2101cd88470f6ee4 | |
parent | b7d3bbceb7a20116efa905f2e82bcaea2f57031f (diff) | |
download | gcc-ac59a959363d95d4bcb62231d545319166471fc3.zip gcc-ac59a959363d95d4bcb62231d545319166471fc3.tar.gz gcc-ac59a959363d95d4bcb62231d545319166471fc3.tar.bz2 |
re PR tree-optimization/19951 (ICE in tree_split_edge, at tree-cfg.c:3199 with -ftree-vectorize)
PR tree-optimization/19951
* tree-vect-analyze.c (vect_analyze_loop_form): Check if loop exit edge
is abnormal.
From-SVN: r95301
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-vect-analyze.c | 25 |
2 files changed, 26 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eb1a9be..4a059c9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/tree-vect-analyze.c b/gcc/tree-vect-analyze.c index 7071199..fd26c90 100644 --- a/gcc/tree-vect-analyze.c +++ b/gcc/tree-vect-analyze.c @@ -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) |