[llvm] [SimplifyCFG] Avoid scanning functions multiple times in `removeUnreachableBlocks` (PR #213416)
Alexis Engelke via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 1 02:33:13 PDT 2026
================
@@ -2695,174 +2695,180 @@ static bool markAliveBlocks(Function &F, SmallVectorImpl<bool> &Reachable,
// Do a quick scan of the basic block, turning any obviously unreachable
// instructions into LLVM unreachable insts. The instruction combining pass
// canonicalizes unreachable insts into stores to null or undef.
- for (Instruction &I : *BB) {
- if (auto *CI = dyn_cast<CallInst>(&I)) {
- Value *Callee = CI->getCalledOperand();
- // Handle intrinsic calls.
- if (Function *F = dyn_cast<Function>(Callee)) {
- auto IntrinsicID = F->getIntrinsicID();
- // Assumptions that are known to be false are equivalent to
- // unreachable. Also, if the condition is undefined, then we make the
- // choice most beneficial to the optimizer, and choose that to also be
- // unreachable.
- if (IntrinsicID == Intrinsic::assume) {
- if (match(CI->getArgOperand(0), m_CombineOr(m_Zero(), m_Undef()))) {
- // Don't insert a call to llvm.trap right before the unreachable.
- changeToUnreachable(CI, false, DTU);
- Changed = true;
- break;
- }
- } else if (IntrinsicID == Intrinsic::experimental_guard) {
- // A call to the guard intrinsic bails out of the current
- // compilation unit if the predicate passed to it is false. If the
- // predicate is a constant false, then we know the guard will bail
- // out of the current compile unconditionally, so all code following
- // it is dead.
- //
- // Note: unlike in llvm.assume, it is not "obviously profitable" for
- // guards to treat `undef` as `false` since a guard on `undef` can
- // still be useful for widening.
- if (match(CI->getArgOperand(0), m_Zero()))
- if (!isa<UnreachableInst>(CI->getNextNode())) {
- changeToUnreachable(CI->getNextNode(), false, DTU);
+ if (SimplifyInsts) {
----------------
aengelke wrote:
Consider adding a note that this "quick scan" is anything but quick.
https://github.com/llvm/llvm-project/pull/213416
More information about the llvm-commits
mailing list