diff --git a/gcc/testsuite/gcc.c-torture/execute/pr98736.c b/gcc/testsuite/gcc.c-torture/execute/pr98736.c new file mode 100644 index 00000000000..c066abcd86a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr98736.c @@ -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(); +} diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 7ee19fc8677..583bb062b76 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -3152,11 +3152,19 @@ loop_distribution::distribute_loop (class loop *loop, vec 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;