re PR tree-optimization/23048 (ICE in get_loop_body with -O1 -ftree-vectorize on 4.1.x)
PR tree-optimization/23048 * tree-if-conv.c (if_convertible_bb_p): Supply basic_block as third parameter. Check whether latch is dominated by exit block or not. (if_convertible_loop_p): Supply exit block itself to if_convertible_bb_p. * gcc.dg/tree-ssa/pr23048.c: New test. From-SVN: r103287
This commit is contained in:
parent
e55ef7f426
commit
3d91803a0b
@ -1,3 +1,12 @@
|
|||||||
|
2005-08-19 Devang Patel <dpatel@apple.com>
|
||||||
|
|
||||||
|
PR tree-optimization/23048
|
||||||
|
* tree-if-conv.c (if_convertible_bb_p): Supply basic_block as
|
||||||
|
third parameter. Check whether latch is dominated by exit
|
||||||
|
block or not.
|
||||||
|
(if_convertible_loop_p): Supply exit block itself to
|
||||||
|
if_convertible_bb_p.
|
||||||
|
|
||||||
2005-08-19 Richard Earnshaw <richard.earnshaw@arm.com>
|
2005-08-19 Richard Earnshaw <richard.earnshaw@arm.com>
|
||||||
|
|
||||||
PR target/23473
|
PR target/23473
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2005-08-19 Devang Patel <dpatel@apple.com>
|
||||||
|
|
||||||
|
PR tree-optimization/23048
|
||||||
|
* gcc.dg/tree-ssa/pr23048.c: New test.
|
||||||
|
|
||||||
2005-08-19 Andrew Pinski <pinskia@physics.uc.edu>
|
2005-08-19 Andrew Pinski <pinskia@physics.uc.edu>
|
||||||
|
|
||||||
PR middle-end/20624
|
PR middle-end/20624
|
||||||
|
11
gcc/testsuite/gcc.dg/tree-ssa/pr23048.c
Normal file
11
gcc/testsuite/gcc.dg/tree-ssa/pr23048.c
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O1 -ftree-vectorize" } */
|
||||||
|
|
||||||
|
void f(unsigned char *mem)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0;i<4;i++) {
|
||||||
|
while(mem[i]==0) ;
|
||||||
|
}
|
||||||
|
}
|
@ -110,7 +110,7 @@ static void tree_if_convert_cond_expr (struct loop *, tree, tree,
|
|||||||
static bool if_convertible_phi_p (struct loop *, basic_block, tree);
|
static bool if_convertible_phi_p (struct loop *, basic_block, tree);
|
||||||
static bool if_convertible_modify_expr_p (struct loop *, basic_block, tree);
|
static bool if_convertible_modify_expr_p (struct loop *, basic_block, tree);
|
||||||
static bool if_convertible_stmt_p (struct loop *, basic_block, tree);
|
static bool if_convertible_stmt_p (struct loop *, basic_block, tree);
|
||||||
static bool if_convertible_bb_p (struct loop *, basic_block, bool);
|
static bool if_convertible_bb_p (struct loop *, basic_block, basic_block);
|
||||||
static bool if_convertible_loop_p (struct loop *, bool);
|
static bool if_convertible_loop_p (struct loop *, bool);
|
||||||
static void add_to_predicate_list (basic_block, tree);
|
static void add_to_predicate_list (basic_block, tree);
|
||||||
static tree add_to_dst_predicate_list (struct loop * loop, basic_block, tree, tree,
|
static tree add_to_dst_predicate_list (struct loop * loop, basic_block, tree, tree,
|
||||||
@ -437,7 +437,7 @@ if_convertible_stmt_p (struct loop *loop, basic_block bb, tree stmt)
|
|||||||
BB is inside loop LOOP. */
|
BB is inside loop LOOP. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
if_convertible_bb_p (struct loop *loop, basic_block bb, bool exit_bb_seen)
|
if_convertible_bb_p (struct loop *loop, basic_block bb, basic_block exit_bb)
|
||||||
{
|
{
|
||||||
edge e;
|
edge e;
|
||||||
edge_iterator ei;
|
edge_iterator ei;
|
||||||
@ -445,7 +445,7 @@ if_convertible_bb_p (struct loop *loop, basic_block bb, bool exit_bb_seen)
|
|||||||
if (dump_file && (dump_flags & TDF_DETAILS))
|
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||||
fprintf (dump_file, "----------[%d]-------------\n", bb->index);
|
fprintf (dump_file, "----------[%d]-------------\n", bb->index);
|
||||||
|
|
||||||
if (exit_bb_seen)
|
if (exit_bb)
|
||||||
{
|
{
|
||||||
if (bb != loop->latch)
|
if (bb != loop->latch)
|
||||||
{
|
{
|
||||||
@ -459,6 +459,14 @@ if_convertible_bb_p (struct loop *loop, basic_block bb, bool exit_bb_seen)
|
|||||||
fprintf (dump_file, "non empty basic block after exit bb\n");
|
fprintf (dump_file, "non empty basic block after exit bb\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
else if (bb == loop->latch
|
||||||
|
&& bb != exit_bb
|
||||||
|
&& !dominated_by_p (CDI_DOMINATORS, bb, exit_bb))
|
||||||
|
{
|
||||||
|
if (dump_file && (dump_flags & TDF_DETAILS))
|
||||||
|
fprintf (dump_file, "latch is not dominated by exit_block\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Be less adventurous and handle only normal edges. */
|
/* Be less adventurous and handle only normal edges. */
|
||||||
@ -494,7 +502,7 @@ if_convertible_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
edge e;
|
edge e;
|
||||||
edge_iterator ei;
|
edge_iterator ei;
|
||||||
bool exit_bb_seen = false;
|
basic_block exit_bb = NULL;
|
||||||
|
|
||||||
/* Handle only inner most loop. */
|
/* Handle only inner most loop. */
|
||||||
if (!loop || loop->inner)
|
if (!loop || loop->inner)
|
||||||
@ -547,7 +555,7 @@ if_convertible_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
|
|||||||
{
|
{
|
||||||
bb = ifc_bbs[i];
|
bb = ifc_bbs[i];
|
||||||
|
|
||||||
if (!if_convertible_bb_p (loop, bb, exit_bb_seen))
|
if (!if_convertible_bb_p (loop, bb, exit_bb))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Check statements. */
|
/* Check statements. */
|
||||||
@ -562,7 +570,7 @@ if_convertible_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (bb_with_exit_edge_p (loop, bb))
|
if (bb_with_exit_edge_p (loop, bb))
|
||||||
exit_bb_seen = true;
|
exit_bb = bb;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* OK. Did not find any potential issues so go ahead in if-convert
|
/* OK. Did not find any potential issues so go ahead in if-convert
|
||||||
|
Loading…
Reference in New Issue
Block a user