tree-optimization/98736 - use programing order preserved RPO in ldist
Tree loop distribution uses RPO to build reduced dependence graph, it's important that RPO preserves the original programing order. Though it usually does so, when distributing loop nest, exit BB can be placed before some loop BBs while after loop header. This patch fixes the issue by calling rev_post_order_and_mark_dfs_back_seme. gcc/ChangeLog: PR tree-optimization/98736 * tree-loop-distribution.c * (loop_distribution::bb_top_order_init): Compute RPO with programing order preserved by calling function rev_post_order_and_mark_dfs_back_seme. gcc/testsuite/ChangeLog: PR tree-optimization/98736 * gcc.c-torture/execute/pr98736.c: New test.
This commit is contained in:
parent
a7698c0e1e
commit
e0bdccac58
14
gcc/testsuite/gcc.c-torture/execute/pr98736.c
Normal file
14
gcc/testsuite/gcc.c-torture/execute/pr98736.c
Normal file
@ -0,0 +1,14 @@
|
||||
/* PR tree-optimization/98736 */
|
||||
|
||||
int a[6];
|
||||
char b, c;
|
||||
int main() {
|
||||
int d[4] = {0, 0, 0, 0};
|
||||
for (c = 0; c <= 5; c++) {
|
||||
for (b = 2; b != 0; b++)
|
||||
a[c] = 8;
|
||||
a[c] = d[3];
|
||||
}
|
||||
if (a[0] != 0)
|
||||
__builtin_abort();
|
||||
}
|
@ -3152,11 +3152,19 @@ loop_distribution::distribute_loop (class loop *loop, vec<gimple *> stmts,
|
||||
void loop_distribution::bb_top_order_init (void)
|
||||
{
|
||||
int rpo_num;
|
||||
int *rpo = XNEWVEC (int, last_basic_block_for_fn (cfun));
|
||||
int *rpo = XNEWVEC (int, n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS);
|
||||
edge entry = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun));
|
||||
bitmap exit_bbs = BITMAP_ALLOC (NULL);
|
||||
|
||||
bb_top_order_index = XNEWVEC (int, last_basic_block_for_fn (cfun));
|
||||
bb_top_order_index_size = last_basic_block_for_fn (cfun);
|
||||
rpo_num = pre_and_rev_post_order_compute_fn (cfun, NULL, rpo, true);
|
||||
|
||||
entry->flags &= ~EDGE_DFS_BACK;
|
||||
bitmap_set_bit (exit_bbs, EXIT_BLOCK);
|
||||
rpo_num = rev_post_order_and_mark_dfs_back_seme (cfun, entry, exit_bbs, true,
|
||||
rpo, NULL);
|
||||
BITMAP_FREE (exit_bbs);
|
||||
|
||||
for (int i = 0; i < rpo_num; i++)
|
||||
bb_top_order_index[rpo[i]] = i;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user