[llvm-branch-commits] [llvm] [SimplifyCFG] Do not thread branches into uncontrolled convergent regions (PR #204958)
Shilei Tian via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 3 16:58:29 PDT 2026
================
@@ -3543,13 +3543,67 @@ static ConstantInt *getKnownValueOnEdge(Value *V, BasicBlock *From,
return nullptr;
}
+static bool isUncontrolledConvergentCall(CallBase *CB) {
+ return CB->isConvergent() && !isa<ConvergenceControlInst>(CB) &&
+ !CB->getConvergenceControlToken();
+}
+
+static bool reachesUncontrolledConvergentCallBeforeBlock(BasicBlock *From,
+ BasicBlock *StopBB) {
+ // Walk predecessors of StopBB to find blocks that can reach it. Only
+ // convergent calls on a cycle with StopBB matter - a convergent call on a
+ // path to function exit cannot have its dynamic instance changed by
+ // threading.
+ SmallPtrSet<BasicBlock *, 8> CanReachStop;
+ SmallVector<BasicBlock *, 8> Worklist;
+ for (BasicBlock *Pred : predecessors(StopBB))
+ Worklist.push_back(Pred);
+
+ while (!Worklist.empty()) {
+ BasicBlock *BB = Worklist.pop_back_val();
+ if (BB == StopBB)
+ continue;
+ if (!CanReachStop.insert(BB).second)
+ continue;
+ if (CanReachStop.size() > MaxJumpThreadingLiveBlocks)
+ return true;
+ append_range(Worklist, predecessors(BB));
+ }
+
+ if (!CanReachStop.contains(From))
+ return false;
+
+ SmallPtrSet<BasicBlock *, 8> Visited;
+ Worklist.push_back(From);
+
+ while (!Worklist.empty()) {
+ BasicBlock *BB = Worklist.pop_back_val();
+ if (BB == StopBB || !CanReachStop.contains(BB))
+ continue;
+
+ if (!Visited.insert(BB).second)
+ continue;
+ if (Visited.size() > MaxJumpThreadingLiveBlocks)
----------------
shiltian wrote:
Done. Let me know what you think.
https://github.com/llvm/llvm-project/pull/204958
More information about the llvm-branch-commits
mailing list