diff options
author | Richard Biener <rguenther@suse.de> | 2018-09-12 14:03:21 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-09-12 14:03:21 +0000 |
commit | b25508e0ccf79f4c7ebd5a80e6ed3fd4a13eec51 (patch) | |
tree | 7eae8819344bcf260623c7f032db75d58362e79a /gcc/tree-ssa-sccvn.c | |
parent | 72ced87475c02fc6d4211a9baa41a8c8bb14ab0c (diff) | |
download | gcc-b25508e0ccf79f4c7ebd5a80e6ed3fd4a13eec51.zip gcc-b25508e0ccf79f4c7ebd5a80e6ed3fd4a13eec51.tar.gz gcc-b25508e0ccf79f4c7ebd5a80e6ed3fd4a13eec51.tar.bz2 |
re PR tree-optimization/87280 (ICE in set_ssa_val_to, at tree-ssa-sccvn.c:3647)
2018-09-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/87280
* tree-ssa-sccvn.c (process_bb): Handle the case of executable
edge but unreachable target.
(do_rpo_vn): For conservatively handling a PHI only mark
the backedge executable but not the block reachable.
* gcc.dg/torture/pr87280.c: New testcase.
From-SVN: r264241
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 8bf724e..2a837c2 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -5976,15 +5976,24 @@ process_bb (rpo_elim &avail, basic_block bb, { FOR_EACH_EDGE (e, ei, bb->succs) { - if (e->flags & EDGE_EXECUTABLE) - continue; - if (dump_file && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, - "marking outgoing edge %d -> %d executable\n", - e->src->index, e->dest->index); - gcc_checking_assert (iterate || !(e->flags & EDGE_DFS_BACK)); - e->flags |= EDGE_EXECUTABLE; - e->dest->flags |= BB_EXECUTABLE; + if (!(e->flags & EDGE_EXECUTABLE)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "marking outgoing edge %d -> %d executable\n", + e->src->index, e->dest->index); + gcc_checking_assert (iterate || !(e->flags & EDGE_DFS_BACK)); + e->flags |= EDGE_EXECUTABLE; + e->dest->flags |= BB_EXECUTABLE; + } + else if (!(e->dest->flags & BB_EXECUTABLE)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "marking destination block %d reachable\n", + e->dest->index); + e->dest->flags |= BB_EXECUTABLE; + } } } for (gimple_stmt_iterator gsi = gsi_start_bb (bb); @@ -6124,20 +6133,37 @@ process_bb (rpo_elim &avail, basic_block bb, e->flags |= EDGE_EXECUTABLE; e->dest->flags |= BB_EXECUTABLE; } + else if (!(e->dest->flags & BB_EXECUTABLE)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "marking destination block %d reachable\n", + e->dest->index); + e->dest->flags |= BB_EXECUTABLE; + } } else if (gsi_one_before_end_p (gsi)) { FOR_EACH_EDGE (e, ei, bb->succs) { - if (e->flags & EDGE_EXECUTABLE) - continue; - if (dump_file && (dump_flags & TDF_DETAILS)) - fprintf (dump_file, - "marking outgoing edge %d -> %d executable\n", - e->src->index, e->dest->index); - gcc_checking_assert (iterate || !(e->flags & EDGE_DFS_BACK)); - e->flags |= EDGE_EXECUTABLE; - e->dest->flags |= BB_EXECUTABLE; + if (!(e->flags & EDGE_EXECUTABLE)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "marking outgoing edge %d -> %d executable\n", + e->src->index, e->dest->index); + gcc_checking_assert (iterate || !(e->flags & EDGE_DFS_BACK)); + e->flags |= EDGE_EXECUTABLE; + e->dest->flags |= BB_EXECUTABLE; + } + else if (!(e->dest->flags & BB_EXECUTABLE)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "marking destination block %d reachable\n", + e->dest->index); + e->dest->flags |= BB_EXECUTABLE; + } } } @@ -6399,7 +6425,6 @@ do_rpo_vn (function *fn, edge entry, bitmap exit_bbs, if (e->flags & EDGE_DFS_BACK) { e->flags |= EDGE_EXECUTABLE; - e->dest->flags |= BB_EXECUTABLE; /* There can be a non-latch backedge into the header which is part of an outer irreducible region. We cannot avoid iterating this block then. */ |