diff options
author | Richard Biener <rguenther@suse.de> | 2018-03-05 13:18:12 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-03-05 13:18:12 +0000 |
commit | 36a9f50ca9813b31879486a6eb536745dd43b9f5 (patch) | |
tree | a4fc4acdc05dc147b9ade90007f6507b8f2cc0ff /gcc/tree-ssa-pre.c | |
parent | 144a822fec6d680b2847f2bd35a6d6ebefd2d885 (diff) |
re PR tree-optimization/84670 (ICE: in compute_antic_aux, at tree-ssa-pre.c:2148 with -O2 -fno-tree-dominator-opts)
2018-03-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/84670
* tree-ssa-pre.c (struct bb_bitmap_sets): Add visited_with_visited_succs
member.
(BB_VISITED_WITH_VISITED_SUCCS): New define.
(compute_antic): Initialize BB_VISITED_WITH_VISITED_SUCCS.
(compute_antic_aux): Only assert the number of values in ANTIC_IN
doesn't grow if all successors (recursively) were visited at least
once.
* gcc.dg/pr84670-1.c: New testcase.
* gcc.dg/pr84670-2.c: Likewise.
* gcc.dg/pr84670-3.c: Likewise.
* gcc.dg/pr84670-4.c: Likewise.
From-SVN: r258243
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index a535c325e0f..fa3daf4137d 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -484,6 +484,10 @@ typedef struct bb_bitmap_sets /* True if we have visited this block during ANTIC calculation. */ unsigned int visited : 1; + /* True if we have visited this block after all successors have been + visited this way. */ + unsigned int visited_with_visited_succs : 1; + /* True when the block contains a call that might not return. */ unsigned int contains_may_not_return_call : 1; } *bb_value_sets_t; @@ -497,6 +501,8 @@ typedef struct bb_bitmap_sets #define NEW_SETS(BB) ((bb_value_sets_t) ((BB)->aux))->new_sets #define EXPR_DIES(BB) ((bb_value_sets_t) ((BB)->aux))->expr_dies #define BB_VISITED(BB) ((bb_value_sets_t) ((BB)->aux))->visited +#define BB_VISITED_WITH_VISITED_SUCCS(BB) \ + ((bb_value_sets_t) ((BB)->aux))->visited_with_visited_succs #define BB_MAY_NOTRETURN(BB) ((bb_value_sets_t) ((BB)->aux))->contains_may_not_return_call #define BB_LIVE_VOP_ON_EXIT(BB) ((bb_value_sets_t) ((BB)->aux))->vop_on_exit @@ -2032,6 +2038,8 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge) { e = single_succ_edge (block); gcc_assert (BB_VISITED (e->dest)); + BB_VISITED_WITH_VISITED_SUCCS (block) + = BB_VISITED_WITH_VISITED_SUCCS (e->dest); phi_translate_set (ANTIC_OUT, ANTIC_IN (e->dest), e); } /* If we have multiple successors, we take the intersection of all of @@ -2042,6 +2050,7 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge) size_t i; edge first = NULL; + BB_VISITED_WITH_VISITED_SUCCS (block) = true; auto_vec<edge> worklist (EDGE_COUNT (block->succs)); FOR_EACH_EDGE (e, ei, block->succs) { @@ -2060,6 +2069,8 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge) fprintf (dump_file, "ANTIC_IN is MAX on %d->%d\n", e->src->index, e->dest->index); } + BB_VISITED_WITH_VISITED_SUCCS (block) + &= BB_VISITED_WITH_VISITED_SUCCS (e->dest); } /* Of multiple successors we have to have visited one already @@ -2139,7 +2150,7 @@ compute_antic_aux (basic_block block, bool block_has_abnormal_pred_edge) changed = true; /* After the initial value set computation the value set may only shrink during the iteration. */ - if (was_visited && flag_checking) + if (was_visited && BB_VISITED_WITH_VISITED_SUCCS (block) && flag_checking) { bitmap_iterator bi; unsigned int i; @@ -2318,6 +2329,7 @@ compute_antic (void) FOR_ALL_BB_FN (block, cfun) { BB_VISITED (block) = 0; + BB_VISITED_WITH_VISITED_SUCCS (block) = 0; FOR_EACH_EDGE (e, ei, block->preds) if (e->flags & EDGE_ABNORMAL) @@ -2334,6 +2346,7 @@ compute_antic (void) /* At the exit block we anticipate nothing. */ BB_VISITED (EXIT_BLOCK_PTR_FOR_FN (cfun)) = 1; + BB_VISITED_WITH_VISITED_SUCCS (EXIT_BLOCK_PTR_FOR_FN (cfun)) = 1; /* For ANTIC computation we need a postorder that also guarantees that a block with a single successor is visited after its successor. |