[llvm] [CycleAnalysis] Methods to verify cycles and their nesting. (PR #102300)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 16 05:11:50 PDT 2024
================
@@ -119,6 +120,104 @@ auto GenericCycle<ContextT>::getCyclePredecessor() const -> BlockT * {
return Out;
}
+/// \brief Verify that this is actually a well-formed cycle in the CFG.
+template <typename ContextT> void GenericCycle<ContextT>::verifyCycle() const {
+#ifndef NDEBUG
+ assert(!Blocks.empty() && "Cycle cannot be empty.");
+ DenseSet<BlockT *> Blocks;
+ for (BlockT *BB : blocks()) {
+ assert(Blocks.insert(BB).second); // duplicates in block list?
+ }
+ assert(!Entries.empty() && "Cycle must have one or more entries.");
+
+ DenseSet<BlockT *> Entries;
+ for (BlockT *Entry : entries()) {
+ assert(Entries.insert(Entry).second); // duplicate entry?
+ assert(contains(Entry));
+ }
+
+ // Setup for using a depth-first iterator to visit every block in the cycle.
+ SmallVector<BlockT *, 8> ExitBBs;
+ getExitBlocks(ExitBBs);
+ df_iterator_default_set<BlockT *> VisitSet;
+ VisitSet.insert(ExitBBs.begin(), ExitBBs.end());
----------------
arsenm wrote:
I assume you can do this insert directly in the constructor
https://github.com/llvm/llvm-project/pull/102300
More information about the llvm-commits
mailing list