[llvm] [nfc] move `isPresplitCoroSuspendExitEdge` to Analysis/CFG (PR #135849)
Mircea Trofin via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 15 13:31:42 PDT 2025
https://github.com/mtrofin created https://github.com/llvm/llvm-project/pull/135849
None
>From cecf63c757ce9d1cbd76c25555de5d5a51836203 Mon Sep 17 00:00:00 2001
From: Mircea Trofin <mtrofin at google.com>
Date: Mon, 14 Apr 2025 16:16:00 -0700
Subject: [PATCH] [nfc] move `isPresplitCoroSuspendExitEdge` to Analysis/CFG
---
llvm/include/llvm/Analysis/CFG.h | 19 +++++++++++++++++++
.../llvm/Transforms/Utils/BasicBlockUtils.h | 18 ------------------
llvm/lib/Analysis/CFG.cpp | 12 ++++++++++++
llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 12 ------------
4 files changed, 31 insertions(+), 30 deletions(-)
diff --git a/llvm/include/llvm/Analysis/CFG.h b/llvm/include/llvm/Analysis/CFG.h
index 23bc10a4a9d1b..a1fc392d3336f 100644
--- a/llvm/include/llvm/Analysis/CFG.h
+++ b/llvm/include/llvm/Analysis/CFG.h
@@ -174,6 +174,25 @@ bool containsIrreducibleCFG(RPOTraversalT &RPOTraversal, const LoopInfoT &LI) {
return false;
}
+
+// Returns true if these basic blocks belong to a presplit coroutine and the
+// edge corresponds to the 'default' case in the switch statement in the
+// pattern:
+//
+// %0 = call i8 @llvm.coro.suspend(token none, i1 false)
+// switch i8 %0, label %suspend [i8 0, label %resume
+// i8 1, label %cleanup]
+//
+// i.e. the edge to the `%suspend` BB. This edge is special in that it will
+// be elided by coroutine lowering (coro-split), and the `%suspend` BB needs
+// to be kept as-is. It's not a real CFG edge - post-lowering, it will end
+// up being a `ret`, and it must be thus lowerable to support symmetric
+// transfer. For example:
+// - this edge is not a loop exit edge if encountered in a loop (and should
+// be ignored)
+// - must not be split for PGO instrumentation, for example.
+bool isPresplitCoroSuspendExitEdge(const BasicBlock &Src,
+ const BasicBlock &Dest);
} // End llvm namespace
#endif
diff --git a/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h b/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
index 6faff3d1fd8e3..adc1851c2ec2f 100644
--- a/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
+++ b/llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
@@ -610,24 +610,6 @@ void InvertBranch(BranchInst *PBI, IRBuilderBase &Builder);
// br/brcond/unreachable/ret
bool hasOnlySimpleTerminator(const Function &F);
-// Returns true if these basic blocks belong to a presplit coroutine and the
-// edge corresponds to the 'default' case in the switch statement in the
-// pattern:
-//
-// %0 = call i8 @llvm.coro.suspend(token none, i1 false)
-// switch i8 %0, label %suspend [i8 0, label %resume
-// i8 1, label %cleanup]
-//
-// i.e. the edge to the `%suspend` BB. This edge is special in that it will
-// be elided by coroutine lowering (coro-split), and the `%suspend` BB needs
-// to be kept as-is. It's not a real CFG edge - post-lowering, it will end
-// up being a `ret`, and it must be thus lowerable to support symmetric
-// transfer. For example:
-// - this edge is not a loop exit edge if encountered in a loop (and should
-// be ignored)
-// - must not be split for PGO instrumentation, for example.
-bool isPresplitCoroSuspendExitEdge(const BasicBlock &Src,
- const BasicBlock &Dest);
} // end namespace llvm
#endif // LLVM_TRANSFORMS_UTILS_BASICBLOCKUTILS_H
diff --git a/llvm/lib/Analysis/CFG.cpp b/llvm/lib/Analysis/CFG.cpp
index 841b835052380..33a2fc178907b 100644
--- a/llvm/lib/Analysis/CFG.cpp
+++ b/llvm/lib/Analysis/CFG.cpp
@@ -322,3 +322,15 @@ bool llvm::isPotentiallyReachable(
return isPotentiallyReachable(
A->getParent(), B->getParent(), ExclusionSet, DT, LI);
}
+
+bool llvm::isPresplitCoroSuspendExitEdge(const BasicBlock &Src,
+ const BasicBlock &Dest) {
+ assert(Src.getParent() == Dest.getParent());
+ if (!Src.getParent()->isPresplitCoroutine())
+ return false;
+ if (auto *SW = dyn_cast<SwitchInst>(Src.getTerminator()))
+ if (auto *Intr = dyn_cast<IntrinsicInst>(SW->getCondition()))
+ return Intr->getIntrinsicID() == Intrinsic::coro_suspend &&
+ SW->getDefaultDest() == &Dest;
+ return false;
+}
\ No newline at end of file
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
index 6f36e24000aa5..b78270f6309ff 100644
--- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -1916,15 +1916,3 @@ bool llvm::hasOnlySimpleTerminator(const Function &F) {
}
return true;
}
-
-bool llvm::isPresplitCoroSuspendExitEdge(const BasicBlock &Src,
- const BasicBlock &Dest) {
- assert(Src.getParent() == Dest.getParent());
- if (!Src.getParent()->isPresplitCoroutine())
- return false;
- if (auto *SW = dyn_cast<SwitchInst>(Src.getTerminator()))
- if (auto *Intr = dyn_cast<IntrinsicInst>(SW->getCondition()))
- return Intr->getIntrinsicID() == Intrinsic::coro_suspend &&
- SW->getDefaultDest() == &Dest;
- return false;
-}
More information about the llvm-commits
mailing list