Summary: | [ICE] verify_flow_info failed (loop) | ||
---|---|---|---|
Product: | gcc | Reporter: | Francois-Xavier Coudert <fxcoudert> |
Component: | tree-optimization | Assignee: | Not yet assigned to anyone <unassigned> |
Status: | RESOLVED FIXED | ||
Severity: | normal | CC: | dorit, gcc-bugs, htanabe, reichelt |
Priority: | P2 | Keywords: | ice-on-valid-code, monitored |
Version: | 4.0.0 | ||
Target Milestone: | 4.0.0 | ||
Host: | i686-gnu-linux | Target: | |
Build: | Known to work: | ||
Known to fail: | Last reconfirmed: | 2004-11-29 14:03:05 |
Description
Francois-Xavier Coudert
2004-11-29 14:00:59 UTC
Here is an example which fails on ppc-darwin with altivec turned on: subroutine test(n, v) implicit none integer :: n, i real(4) :: v(n) do i = 1, n v(i) = 0 end do return end *** Bug 18734 has been marked as a duplicate of this bug. *** This patch should fix the problem: Index: tree-vectorizer.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/tree-vectorizer.c,v retrieving revision 2.42 diff -c -3 -p -r2.42 tree-vectorizer.c *** tree-vectorizer.c 25 Nov 2004 22:31:09 -0000 2.42 --- tree-vectorizer.c 1 Dec 2004 18:30:50 -0000 *************** slpeel_make_loop_iterate_ntimes (struct *** 665,670 **** --- 665,672 ---- tree exit_label = tree_block_label (loop->single_exit->dest); tree init = build_int_cst (TREE_TYPE (niters), 0); tree step = build_int_cst (TREE_TYPE (niters), 1); + tree then_label; + tree else_label; orig_cond = get_loop_exit_condition (loop); gcc_assert (orig_cond); *************** slpeel_make_loop_iterate_ntimes (struct *** 677,690 **** gcc_assert (bsi_stmt (loop_exit_bsi) == orig_cond); if (exit_edge->flags & EDGE_TRUE_VALUE) /* 'then' edge exits the loop. */ ! cond = build2 (GE_EXPR, boolean_type_node, indx_after_incr, niters); else /* 'then' edge loops back. */ ! cond = build2 (LT_EXPR, boolean_type_node, indx_after_incr, niters); - begin_label = build1 (GOTO_EXPR, void_type_node, begin_label); - exit_label = build1 (GOTO_EXPR, void_type_node, exit_label); cond_stmt = build3 (COND_EXPR, TREE_TYPE (orig_cond), cond, ! begin_label, exit_label); bsi_insert_before (&loop_exit_bsi, cond_stmt, BSI_SAME_STMT); /* Remove old loop exit test: */ --- 679,698 ---- gcc_assert (bsi_stmt (loop_exit_bsi) == orig_cond); if (exit_edge->flags & EDGE_TRUE_VALUE) /* 'then' edge exits the loop. */ ! { ! cond = build2 (GE_EXPR, boolean_type_node, indx_after_incr, niters); ! then_label = build1 (GOTO_EXPR, void_type_node, exit_label); ! else_label = build1 (GOTO_EXPR, void_type_node, begin_label); ! } else /* 'then' edge loops back. */ ! { ! cond = build2 (LT_EXPR, boolean_type_node, indx_after_incr, niters); ! then_label = build1 (GOTO_EXPR, void_type_node, begin_label); ! else_label = build1 (GOTO_EXPR, void_type_node, exit_label); ! } cond_stmt = build3 (COND_EXPR, TREE_TYPE (orig_cond), cond, ! then_label, else_label); bsi_insert_before (&loop_exit_bsi, cond_stmt, BSI_SAME_STMT); /* Remove old loop exit test: */ I'll submit a patch to mainline shortly. > I'll submit a patch to mainline shortly. patch: http://gcc.gnu.org/ml/gcc-patches/2004-12/msg00077.html Subject: Bug 18716 CVSROOT: /cvs/gcc Module name: gcc Changes by: dorit@gcc.gnu.org 2004-12-02 14:00:42 Modified files: gcc : ChangeLog tree-vectorizer.c Log message: PR tree-opt/18716 * tree-vectorizer.c (slpeel_make_loop_iterate_ntimes): Properly set then and else labels. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.6678&r2=2.6679 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/tree-vectorizer.c.diff?cvsroot=gcc&r1=2.46&r2=2.47 Fixed. |