diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2022-01-21 13:04:20 +0100 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2022-02-03 14:06:45 +0100 |
commit | 83ad3a96eb8a43611afd5733aa0a4feb6373b5f0 (patch) | |
tree | 1789c09c63ee0d07a1ac8a49777bd6bd34ab4113 /gcc | |
parent | 635504510a9410844991c68880f2e7352cacfd86 (diff) | |
download | gcc-83ad3a96eb8a43611afd5733aa0a4feb6373b5f0.zip gcc-83ad3a96eb8a43611afd5733aa0a4feb6373b5f0.tar.gz gcc-83ad3a96eb8a43611afd5733aa0a4feb6373b5f0.tar.bz2 |
Assert that backedges are available in path solver.
gcc/ChangeLog:
* cfganal.cc (verify_marked_backedges): New.
* cfganal.h (verify_marked_backedges): New.
* gimple-range-path.cc (path_range_query::path_range_query):
Verify freshness of back edges.
* tree-ssa-loop-ch.cc (ch_base::copy_headers): Call
mark_dfs_back_edges.
* tree-ssa-threadbackward.cc (back_threader::back_threader): Move
path_range_query construction after backedges have been
updated.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cfganal.cc | 35 | ||||
-rw-r--r-- | gcc/cfganal.h | 1 | ||||
-rw-r--r-- | gcc/gimple-range-path.cc | 3 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ch.cc | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-threadbackward.cc | 2 |
5 files changed, 42 insertions, 1 deletions
diff --git a/gcc/cfganal.cc b/gcc/cfganal.cc index 79c627a..d76d47a 100644 --- a/gcc/cfganal.cc +++ b/gcc/cfganal.cc @@ -27,6 +27,7 @@ along with GCC; see the file COPYING3. If not see #include "timevar.h" #include "cfganal.h" #include "cfgloop.h" +#include "diagnostic.h" namespace { /* Store the data structures necessary for depth-first search. */ @@ -141,6 +142,40 @@ mark_dfs_back_edges (void) return mark_dfs_back_edges (cfun); } +/* Return TRUE if EDGE_DFS_BACK is up to date for CFUN. */ + +void +verify_marked_backedges (struct function *fun) +{ + auto_edge_flag saved_dfs_back (fun); + basic_block bb; + edge e; + edge_iterator ei; + + // Save all the back edges... + FOR_EACH_BB_FN (bb, fun) + FOR_EACH_EDGE (e, ei, bb->succs) + { + if (e->flags & EDGE_DFS_BACK) + { + e->flags |= saved_dfs_back; + e->flags &= ~EDGE_DFS_BACK; + } + } + + // ...and verify that recalculating them agrees with the saved ones. + mark_dfs_back_edges (); + FOR_EACH_BB_FN (bb, fun) + FOR_EACH_EDGE (e, ei, bb->succs) + { + if (((e->flags & EDGE_DFS_BACK) != 0) + != ((e->flags & saved_dfs_back) != 0)) + internal_error ("%<verify_marked_backedges%> failed"); + + e->flags &= ~saved_dfs_back; + } +} + /* Find unreachable blocks. An unreachable block will have 0 in the reachable bit in block->flags. A nonzero value indicates the block is reachable. */ diff --git a/gcc/cfganal.h b/gcc/cfganal.h index ac637de..bb40239 100644 --- a/gcc/cfganal.h +++ b/gcc/cfganal.h @@ -51,6 +51,7 @@ private: extern bool mark_dfs_back_edges (struct function *); extern bool mark_dfs_back_edges (void); +extern void verify_marked_backedges (struct function *); extern void find_unreachable_blocks (void); extern void verify_no_unreachable_blocks (void); struct edge_list * create_edge_list (void); diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc index 3ee4989..3bf9bd1 100644 --- a/gcc/gimple-range-path.cc +++ b/gcc/gimple-range-path.cc @@ -48,6 +48,9 @@ path_range_query::path_range_query (bool resolve, gimple_ranger *ranger) m_ranger = ranger; m_oracle = new path_oracle (m_ranger->oracle ()); + + if (m_resolve && flag_checking) + verify_marked_backedges (cfun); } path_range_query::~path_range_query () diff --git a/gcc/tree-ssa-loop-ch.cc b/gcc/tree-ssa-loop-ch.cc index 8e64863..2f5a390 100644 --- a/gcc/tree-ssa-loop-ch.cc +++ b/gcc/tree-ssa-loop-ch.cc @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see #include "value-range.h" #include "gimple-range.h" #include "gimple-range-path.h" +#include "cfganal.h" /* Duplicates headers of loops if they are small enough, so that the statements in the loop body are always executed when the loop is entered. This @@ -384,6 +385,7 @@ ch_base::copy_headers (function *fun) auto_vec<loop_p> candidates; auto_vec<std::pair<edge, loop_p> > copied; + mark_dfs_back_edges (); path_range_query *query = new path_range_query; for (auto loop : loops_list (cfun, 0)) { diff --git a/gcc/tree-ssa-threadbackward.cc b/gcc/tree-ssa-threadbackward.cc index 3ca65b3..3519aca 100644 --- a/gcc/tree-ssa-threadbackward.cc +++ b/gcc/tree-ssa-threadbackward.cc @@ -142,12 +142,12 @@ back_threader::back_threader (function *fun, unsigned flags, bool first) m_fun = fun; m_flags = flags; - m_solver = new path_range_query (flags & BT_RESOLVE); m_last_stmt = NULL; // The path solver needs EDGE_DFS_BACK in resolving mode. if (flags & BT_RESOLVE) mark_dfs_back_edges (); + m_solver = new path_range_query (flags & BT_RESOLVE); } back_threader::~back_threader () |