From bfedc2aa7668a184d1a8bad709f42e2d092b00d6 Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Wed, 18 Mar 2026 16:46:28 +0100 Subject: [PATCH] [Polly][NFC] Drop uses of BranchInst (#187301) --- polly/include/polly/CodeGen/IRBuilder.h | 2 +- polly/include/polly/CodeGen/Utils.h | 6 ++--- polly/include/polly/ScopDetection.h | 4 ++-- polly/include/polly/Support/ScopHelper.h | 9 -------- polly/lib/Analysis/ScopBuilder.cpp | 21 ++++++------------ polly/lib/Analysis/ScopDetection.cpp | 28 +++++++++++++----------- polly/lib/CodeGen/BlockGenerators.cpp | 2 +- polly/lib/CodeGen/IRBuilder.cpp | 2 +- polly/lib/CodeGen/LoopGenerators.cpp | 2 +- polly/lib/CodeGen/Utils.cpp | 4 ++-- polly/lib/Support/ScopHelper.cpp | 14 ------------ polly/lib/Transform/CodePreparation.cpp | 3 +-- 12 files changed, 34 insertions(+), 63 deletions(-) diff --git a/polly/include/polly/CodeGen/IRBuilder.h b/polly/include/polly/CodeGen/IRBuilder.h index 5a111e9a2cb7..aa112ba760b1 100644 --- a/polly/include/polly/CodeGen/IRBuilder.h +++ b/polly/include/polly/CodeGen/IRBuilder.h @@ -62,7 +62,7 @@ public: /// Last argument is optional, if no value is passed, we don't annotate /// any vectorize metadata. void annotateLoopLatch( - llvm::BranchInst *B, bool IsParallel, + llvm::CondBrInst *B, bool IsParallel, std::optional EnableVectorizeMetadata = std::nullopt) const; /// Add alternative alias based pointers diff --git a/polly/include/polly/CodeGen/Utils.h b/polly/include/polly/CodeGen/Utils.h index 0678e34b8703..e4080bc6b5e3 100644 --- a/polly/include/polly/CodeGen/Utils.h +++ b/polly/include/polly/CodeGen/Utils.h @@ -21,7 +21,7 @@ class BasicBlock; class DominatorTree; class RegionInfo; class LoopInfo; -class BranchInst; +class CondBrInst; } // namespace llvm namespace polly { @@ -62,10 +62,10 @@ using BBPair = std::pair; /// /// @return An std::pair: /// - The first element is a BBPair of (StartBlock, EndBlock). -/// - The second element is the BranchInst which conditionally +/// - The second element is the CondBrInst which conditionally /// branches to the SCoP based on the RTC. /// -std::pair +std::pair executeScopConditionally(Scop &S, llvm::Value *RTC, llvm::DominatorTree &DT, llvm::RegionInfo &RI, llvm::LoopInfo &LI); } // namespace polly diff --git a/polly/include/polly/ScopDetection.h b/polly/include/polly/ScopDetection.h index 1f8687f7cdf6..ee9b026a296f 100644 --- a/polly/include/polly/ScopDetection.h +++ b/polly/include/polly/ScopDetection.h @@ -61,8 +61,8 @@ using llvm::AnalysisInfoMixin; using llvm::AnalysisKey; using llvm::AnalysisUsage; using llvm::BatchAAResults; -using llvm::BranchInst; using llvm::CallInst; +using llvm::CondBrInst; using llvm::DenseMap; using llvm::DominatorTree; using llvm::Function; @@ -428,7 +428,7 @@ private: /// @param Condition The branch condition. /// @param IsLoopBranch Flag to indicate the branch is a loop exit/latch. /// @param Context The context of scop detection. - bool isValidBranch(BasicBlock &BB, BranchInst *BI, Value *Condition, + bool isValidBranch(BasicBlock &BB, CondBrInst *BI, Value *Condition, bool IsLoopBranch, DetectionContext &Context); /// Check if the SCEV @p S is affine in the current @p Context. diff --git a/polly/include/polly/Support/ScopHelper.h b/polly/include/polly/Support/ScopHelper.h index fa36acf45882..e5cc6c4fddcf 100644 --- a/polly/include/polly/Support/ScopHelper.h +++ b/polly/include/polly/Support/ScopHelper.h @@ -398,15 +398,6 @@ llvm::Value *expandCodeFor(Scop &S, llvm::ScalarEvolution &SE, llvm::BasicBlock::iterator IP, ValueMapT *VMap, LoopToScevMapT *LoopMap, llvm::BasicBlock *RTCBB); -/// Return the condition for the terminator @p TI. -/// -/// For unconditional branches the "i1 true" condition will be returned. -/// -/// @param TI The terminator to get the condition from. -/// -/// @return The condition of @p TI and nullptr if none could be extracted. -llvm::Value *getConditionFromTerminator(llvm::Instruction *TI); - /// Get the smallest loop that contains @p S but is not in @p S. llvm::Loop *getLoopSurroundingScop(Scop &S, llvm::LoopInfo &LI); diff --git a/polly/lib/Analysis/ScopBuilder.cpp b/polly/lib/Analysis/ScopBuilder.cpp index f4d654fa74cb..6f415420fe3d 100644 --- a/polly/lib/Analysis/ScopBuilder.cpp +++ b/polly/lib/Analysis/ScopBuilder.cpp @@ -394,8 +394,7 @@ bool ScopBuilder::buildConditionSets( BasicBlock *BB, SwitchInst *SI, Loop *L, __isl_keep isl_set *Domain, DenseMap &InvalidDomainMap, SmallVectorImpl<__isl_give isl_set *> &ConditionSets) { - Value *Condition = getConditionFromTerminator(SI); - assert(Condition && "No condition for switch"); + Value *Condition = SI->getCondition(); isl_pw_aff *LHS, *RHS; LHS = getPwAff(BB, InvalidDomainMap, SE.getSCEVAtScope(Condition, L)); @@ -572,16 +571,12 @@ bool ScopBuilder::buildConditionSets( return buildConditionSets(BB, SI, L, Domain, InvalidDomainMap, ConditionSets); - assert(isa(TI) && "Terminator was neither branch nor switch."); - - if (TI->getNumSuccessors() == 1) { + if (isa(TI)) { ConditionSets.push_back(isl_set_copy(Domain)); return true; } - Value *Condition = getConditionFromTerminator(TI); - assert(Condition && "No condition for Terminator"); - + Value *Condition = cast(TI)->getCondition(); return buildConditionSets(BB, Condition, TI, L, Domain, InvalidDomainMap, ConditionSets); } @@ -755,12 +750,9 @@ bool ScopBuilder::addLoopBoundsToHeaderDomain( isl::set BackedgeCondition; Instruction *TI = LatchBB->getTerminator(); - BranchInst *BI = dyn_cast(TI); - assert(BI && "Only branch instructions allowed in loop latches"); - - if (BI->isUnconditional()) + if (isa(TI)) BackedgeCondition = LatchBBDom; - else { + else if (auto *BI = dyn_cast(TI)) { SmallVector ConditionSets; int idx = BI->getSuccessor(0) != HeaderBB; if (!buildConditionSets(LatchBB, TI, L, LatchBBDom.get(), @@ -771,7 +763,8 @@ bool ScopBuilder::addLoopBoundsToHeaderDomain( isl_set_free(ConditionSets[1 - idx]); BackedgeCondition = isl::manage(ConditionSets[idx]); - } + } else + llvm_unreachable("Only branch instructions allowed in loop latches"); int LatchLoopDepth = scop->getRelativeLoopDepth(LI.getLoopFor(LatchBB)); assert(LatchLoopDepth >= LoopDepth); diff --git a/polly/lib/Analysis/ScopDetection.cpp b/polly/lib/Analysis/ScopDetection.cpp index 99269aafb3d1..2f2ab4149aba 100644 --- a/polly/lib/Analysis/ScopDetection.cpp +++ b/polly/lib/Analysis/ScopDetection.cpp @@ -571,7 +571,7 @@ bool ScopDetection::isValidSwitch(BasicBlock &BB, SwitchInst *SI, ConditionSCEV, ConditionSCEV, SI); } -bool ScopDetection::isValidBranch(BasicBlock &BB, BranchInst *BI, +bool ScopDetection::isValidBranch(BasicBlock &BB, CondBrInst *BI, Value *Condition, bool IsLoopBranch, DetectionContext &Context) { // Constant integer conditions are always affine. @@ -665,22 +665,24 @@ bool ScopDetection::isValidCFG(BasicBlock &BB, bool IsLoopBranch, if (isa(TI) && CurRegion.isTopLevelRegion()) return true; - Value *Condition = getConditionFromTerminator(TI); + if (isa(TI)) + return true; - if (!Condition) - return invalid(Context, /*Assert=*/true, &BB); - - // UndefValue is not allowed as condition. - if (isa(Condition)) - return invalid(Context, /*Assert=*/true, TI, &BB); - - if (BranchInst *BI = dyn_cast(TI)) + if (auto *BI = dyn_cast(TI)) { + Value *Condition = BI->getCondition(); + if (isa(Condition)) + return invalid(Context, /*Assert=*/true, TI, &BB); return isValidBranch(BB, BI, Condition, IsLoopBranch, Context); + } - SwitchInst *SI = dyn_cast(TI); - assert(SI && "Terminator was neither branch nor switch"); + if (auto *SI = dyn_cast(TI)) { + Value *Condition = SI->getCondition(); + if (isa(Condition)) + return invalid(Context, /*Assert=*/true, TI, &BB); + return isValidSwitch(BB, SI, Condition, IsLoopBranch, Context); + } - return isValidSwitch(BB, SI, Condition, IsLoopBranch, Context); + return invalid(Context, /*Assert=*/true, &BB); } bool ScopDetection::isValidCallInst(CallInst &CI, diff --git a/polly/lib/CodeGen/BlockGenerators.cpp b/polly/lib/CodeGen/BlockGenerators.cpp index 9c5d0585e2d5..e5c023633818 100644 --- a/polly/lib/CodeGen/BlockGenerators.cpp +++ b/polly/lib/CodeGen/BlockGenerators.cpp @@ -624,7 +624,7 @@ void BlockGenerator::generateConditionalExecution( DomTreeUpdater DTU(GenDT, DomTreeUpdater::UpdateStrategy::Eager); SplitBlockAndInsertIfThen(Cond, Builder.GetInsertPoint(), false, nullptr, &DTU, GenLI); - BranchInst *Branch = cast(HeadBlock->getTerminator()); + CondBrInst *Branch = cast(HeadBlock->getTerminator()); BasicBlock *ThenBlock = Branch->getSuccessor(0); BasicBlock *TailBlock = Branch->getSuccessor(1); diff --git a/polly/lib/CodeGen/IRBuilder.cpp b/polly/lib/CodeGen/IRBuilder.cpp index 782b4b77e4ee..d326ffd8c6a2 100644 --- a/polly/lib/CodeGen/IRBuilder.cpp +++ b/polly/lib/CodeGen/IRBuilder.cpp @@ -146,7 +146,7 @@ void addParallelMetadata(LLVMContext &Ctx, SmallVector *Args, } void ScopAnnotator::annotateLoopLatch( - BranchInst *B, bool IsParallel, + CondBrInst *B, bool IsParallel, std::optional EnableVectorizeMetadata) const { LLVMContext &Ctx = SE->getContext(); SmallVector Args; diff --git a/polly/lib/CodeGen/LoopGenerators.cpp b/polly/lib/CodeGen/LoopGenerators.cpp index 2c8012d26402..57e0cb6377b9 100644 --- a/polly/lib/CodeGen/LoopGenerators.cpp +++ b/polly/lib/CodeGen/LoopGenerators.cpp @@ -163,7 +163,7 @@ Value *polly::createLoop(Value *LB, Value *UB, Value *Stride, Builder.CreateICmp(Predicate, IncrementedIV, UB, "polly.loop_cond"); // Create the loop latch and annotate it as such. - BranchInst *B = Builder.CreateCondBr(LoopCondition, HeaderBB, ExitBB); + CondBrInst *B = Builder.CreateCondBr(LoopCondition, HeaderBB, ExitBB); // Don't annotate vectorize metadata when both LoopVectDisabled and // PollyVectorizeMetadata are disabled. Annotate vectorize metadata to false diff --git a/polly/lib/CodeGen/Utils.cpp b/polly/lib/CodeGen/Utils.cpp index e95705616022..3ddac48de4d0 100644 --- a/polly/lib/CodeGen/Utils.cpp +++ b/polly/lib/CodeGen/Utils.cpp @@ -74,7 +74,7 @@ static BasicBlock *splitEdge(BasicBlock *Prev, BasicBlock *Succ, return MiddleBlock; } -std::pair +std::pair polly::executeScopConditionally(Scop &S, Value *RTC, DominatorTree &DT, RegionInfo &RI, LoopInfo &LI) { Region &R = S.getRegion(); @@ -146,7 +146,7 @@ polly::executeScopConditionally(Scop &S, Value *RTC, DominatorTree &DT, BasicBlock::Create(F->getContext(), "polly.exiting", F); SplitBlock->getTerminator()->eraseFromParent(); Builder.SetInsertPoint(SplitBlock); - BranchInst *CondBr = Builder.CreateCondBr(RTC, StartBlock, S.getEntry()); + CondBrInst *CondBr = Builder.CreateCondBr(RTC, StartBlock, S.getEntry()); if (Loop *L = LI.getLoopFor(SplitBlock)) { L->addBasicBlockToLoop(StartBlock, LI); diff --git a/polly/lib/Support/ScopHelper.cpp b/polly/lib/Support/ScopHelper.cpp index fb80edcf1d30..a9333e23d283 100644 --- a/polly/lib/Support/ScopHelper.cpp +++ b/polly/lib/Support/ScopHelper.cpp @@ -463,20 +463,6 @@ Value *polly::expandCodeFor(Scop &S, llvm::ScalarEvolution &SE, return Expander.expandCodeFor(E, Ty, IP); } -Value *polly::getConditionFromTerminator(Instruction *TI) { - if (BranchInst *BR = dyn_cast(TI)) { - if (BR->isUnconditional()) - return ConstantInt::getTrue(Type::getInt1Ty(TI->getContext())); - - return BR->getCondition(); - } - - if (SwitchInst *SI = dyn_cast(TI)) - return SI->getCondition(); - - return nullptr; -} - Loop *polly::getLoopSurroundingScop(Scop &S, LoopInfo &LI) { // Start with the smallest loop containing the entry and expand that // loop until it contains all blocks in the region. If there is a loop diff --git a/polly/lib/Transform/CodePreparation.cpp b/polly/lib/Transform/CodePreparation.cpp index 3e76dbdff129..2e75ecf8dd1c 100644 --- a/polly/lib/Transform/CodePreparation.cpp +++ b/polly/lib/Transform/CodePreparation.cpp @@ -35,8 +35,7 @@ static bool runCodePreprationImpl(Function &F, DominatorTree *DT, LoopInfo *LI, ++I; // Abort if not necessary to split - if (I->isTerminator() && isa(I) && - cast(I)->isUnconditional()) + if (isa(I)) return false; // splitBlock updates DT, LI and RI.