re PR tree-optimization/55018 (CDDCE pass is too aggressive sometimes with infinite loops and with some functions)
gcc/ PR tree-optimization/55018 * basic-block.h (dfs_find_deadend): New prototype. * cfganal.c (dfs_find_deadend): No longer static. Use bitmap instead of sbitmap for visited. (flow_dfs_compute_reverse_execute): Use dfs_find_deadend here, too. * dominance.c (calc_dfs_tree): If saw_unconnected, traverse from dfs_find_deadend of unconnected b instead of b directly. testsuite/ PR tree-optimization/55018 * gcc.dg/torture/pr55018.c: New test. Co-Authored-By: Jakub Jelinek <jakub@redhat.com> From-SVN: r193047
This commit is contained in:
parent
e212c7f56c
commit
03b06a8344
6 changed files with 57 additions and 12 deletions
|
@ -1,3 +1,15 @@
|
|||
2012-10-31 Steven Bosscher <steven@gcc.gnu.org>
|
||||
Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/55018
|
||||
* basic-block.h (dfs_find_deadend): New prototype.
|
||||
* cfganal.c (dfs_find_deadend): No longer static. Use bitmap
|
||||
instead of sbitmap for visited.
|
||||
(flow_dfs_compute_reverse_execute): Use dfs_find_deadend here, too.
|
||||
* dominance.c (calc_dfs_tree): If saw_unconnected,
|
||||
traverse from dfs_find_deadend of unconnected b
|
||||
instead of b directly.
|
||||
|
||||
2012-10-31 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* config/i386/i386.c (ix86_expand_prologue): Emit frame info for the
|
||||
|
|
|
@ -787,6 +787,7 @@ extern void remove_fake_exit_edges (void);
|
|||
extern void add_noreturn_fake_exit_edges (void);
|
||||
extern void connect_infinite_loops_to_exit (void);
|
||||
extern int post_order_compute (int *, bool, bool);
|
||||
extern basic_block dfs_find_deadend (basic_block);
|
||||
extern int inverted_post_order_compute (int *);
|
||||
extern int pre_and_rev_post_order_compute (int *, int *, bool);
|
||||
extern int dfs_enumerate_from (basic_block, int,
|
||||
|
|
|
@ -573,7 +573,9 @@ post_order_compute (int *post_order, bool include_entry_exit,
|
|||
}
|
||||
|
||||
|
||||
/* Helper routine for inverted_post_order_compute.
|
||||
/* Helper routine for inverted_post_order_compute
|
||||
flow_dfs_compute_reverse_execute, and the reverse-CFG
|
||||
deapth first search in dominance.c.
|
||||
BB has to belong to a region of CFG
|
||||
unreachable by inverted traversal from the exit.
|
||||
i.e. there's no control flow path from ENTRY to EXIT
|
||||
|
@ -593,19 +595,17 @@ post_order_compute (int *post_order, bool include_entry_exit,
|
|||
that all blocks in the region are reachable
|
||||
by starting an inverted traversal from the returned block. */
|
||||
|
||||
static basic_block
|
||||
basic_block
|
||||
dfs_find_deadend (basic_block bb)
|
||||
{
|
||||
sbitmap visited = sbitmap_alloc (last_basic_block);
|
||||
bitmap_clear (visited);
|
||||
bitmap visited = BITMAP_ALLOC (NULL);
|
||||
|
||||
for (;;)
|
||||
{
|
||||
SET_BIT (visited, bb->index);
|
||||
if (EDGE_COUNT (bb->succs) == 0
|
||||
|| TEST_BIT (visited, EDGE_SUCC (bb, 0)->dest->index))
|
||||
|| ! bitmap_set_bit (visited, bb->index))
|
||||
{
|
||||
sbitmap_free (visited);
|
||||
BITMAP_FREE (visited);
|
||||
return bb;
|
||||
}
|
||||
|
||||
|
@ -958,7 +958,7 @@ flow_dfs_compute_reverse_execute (depth_first_search_ds data,
|
|||
/* Determine if there are unvisited basic blocks. */
|
||||
FOR_BB_BETWEEN (bb, last_unvisited, NULL, prev_bb)
|
||||
if (!TEST_BIT (data->visited_blocks, bb->index))
|
||||
return bb;
|
||||
return dfs_find_deadend (bb);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -377,14 +377,18 @@ calc_dfs_tree (struct dom_info *di, bool reverse)
|
|||
{
|
||||
FOR_EACH_BB_REVERSE (b)
|
||||
{
|
||||
basic_block b2;
|
||||
if (di->dfs_order[b->index])
|
||||
continue;
|
||||
bitmap_set_bit (di->fake_exit_edge, b->index);
|
||||
di->dfs_order[b->index] = di->dfsnum;
|
||||
di->dfs_to_bb[di->dfsnum] = b;
|
||||
b2 = dfs_find_deadend (b);
|
||||
gcc_checking_assert (di->dfs_order[b2->index] == 0);
|
||||
bitmap_set_bit (di->fake_exit_edge, b2->index);
|
||||
di->dfs_order[b2->index] = di->dfsnum;
|
||||
di->dfs_to_bb[di->dfsnum] = b2;
|
||||
di->dfs_parent[di->dfsnum] = di->dfs_order[last_basic_block];
|
||||
di->dfsnum++;
|
||||
calc_dfs_tree_nonrec (di, b, reverse);
|
||||
calc_dfs_tree_nonrec (di, b2, reverse);
|
||||
gcc_checking_assert (di->dfs_order[b->index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2012-10-31 Steven Bosscher <steven@gcc.gnu.org>
|
||||
Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/55018
|
||||
* gcc.dg/torture/pr55018.c: New test.
|
||||
|
||||
2012-10-31 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/54583
|
||||
|
|
22
gcc/testsuite/gcc.dg/torture/pr55018.c
Normal file
22
gcc/testsuite/gcc.dg/torture/pr55018.c
Normal file
|
@ -0,0 +1,22 @@
|
|||
/* PR tree-optimization/55018 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fdump-tree-optimized" } */
|
||||
|
||||
void
|
||||
foo (int x)
|
||||
{
|
||||
unsigned int a = 0;
|
||||
int b = 3;
|
||||
if (x)
|
||||
b = 0;
|
||||
lab:
|
||||
if (x)
|
||||
goto lab;
|
||||
a++;
|
||||
if (b != 2)
|
||||
__builtin_printf ("%u", a);
|
||||
goto lab;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump "printf" "optimized" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
Loading…
Add table
Reference in a new issue