https://github.com/jmorse updated https://github.com/llvm/llvm-project/pull/124287
>From 3d2aa2734d6cb49c43565e3ac8584ba8130fe302 Mon Sep 17 00:00:00 2001 From: Jeremy Morse <jeremy.mo...@sony.com> Date: Thu, 23 Jan 2025 12:24:14 +0000 Subject: [PATCH 1/2] [NFC][DebugInfo] Make some block-start-position methods return iterators As part of the "RemoveDIs" work to eliminate debug intrinsics, we're replacing methods that use Instruction*'s as positions with iterators. A number of these (such as getFirstNonPHIOrDbg) are sufficiently infrequently used that we can just replace the pointer-returning version with an iterator-returning version, hopefully without much/any disruption. Thus this patch has getFirstNonPHIOrDbg and getFirstNonPHIOrDbgOrLifetime return an iterator, and updates all call-sites. There are no concerns about the iterators returned being converted to Instruction*'s and losing the debug-info bit: because the methods skip debug intrinsics, the iterator head bit is always false anyway. --- .../ExpressionParser/Clang/IRForTarget.cpp | 6 ++-- llvm/include/llvm/IR/BasicBlock.h | 18 ++++++------ llvm/lib/CodeGen/CodeGenPrepare.cpp | 2 +- llvm/lib/IR/BasicBlock.cpp | 28 +++++++++++++------ .../AArch64/AArch64TargetTransformInfo.cpp | 2 +- .../Target/AMDGPU/SIAnnotateControlFlow.cpp | 4 +-- llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp | 2 +- llvm/lib/Transforms/Coroutines/CoroFrame.cpp | 5 ++-- llvm/lib/Transforms/Coroutines/CoroSplit.cpp | 2 +- llvm/lib/Transforms/IPO/IROutliner.cpp | 2 +- llvm/lib/Transforms/IPO/SCCP.cpp | 4 +-- llvm/lib/Transforms/IPO/SampleProfile.cpp | 2 +- .../InstCombineLoadStoreAlloca.cpp | 4 +-- .../Transforms/Scalar/CallSiteSplitting.cpp | 2 +- .../Transforms/Scalar/SimpleLoopUnswitch.cpp | 2 +- llvm/lib/Transforms/Utils/CodeMoverUtils.cpp | 2 +- llvm/lib/Transforms/Utils/IRNormalizer.cpp | 2 +- llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 4 +-- .../Frontend/OpenMPIRBuilderTest.cpp | 24 ++++++++++------ 19 files changed, 67 insertions(+), 50 deletions(-) diff --git a/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp b/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp index 6c728f34474898..a414ad652448e9 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp @@ -66,7 +66,7 @@ static llvm::Value *FindEntryInstruction(llvm::Function *function) { if (function->empty()) return nullptr; - return function->getEntryBlock().getFirstNonPHIOrDbg(); + return &*function->getEntryBlock().getFirstNonPHIOrDbg(); } IRForTarget::IRForTarget(lldb_private::ClangExpressionDeclMap *decl_map, @@ -361,7 +361,7 @@ bool IRForTarget::CreateResultVariable(llvm::Function &llvm_function) { // there's nothing to put into its equivalent persistent variable. BasicBlock &entry_block(llvm_function.getEntryBlock()); - Instruction *first_entry_instruction(entry_block.getFirstNonPHIOrDbg()); + Instruction *first_entry_instruction(&*entry_block.getFirstNonPHIOrDbg()); if (!first_entry_instruction) return false; @@ -1505,7 +1505,7 @@ bool IRForTarget::ReplaceVariables(Function &llvm_function) { LLDB_LOG(log, "Arg: \"{0}\"", PrintValue(argument)); BasicBlock &entry_block(llvm_function.getEntryBlock()); - Instruction *FirstEntryInstruction(entry_block.getFirstNonPHIOrDbg()); + Instruction *FirstEntryInstruction(&*entry_block.getFirstNonPHIOrDbg()); if (!FirstEntryInstruction) { m_error_stream.Printf("Internal error [IRForTarget]: Couldn't find the " diff --git a/llvm/include/llvm/IR/BasicBlock.h b/llvm/include/llvm/IR/BasicBlock.h index e22fe1e7e7dc8f..5df4dcecebc878 100644 --- a/llvm/include/llvm/IR/BasicBlock.h +++ b/llvm/include/llvm/IR/BasicBlock.h @@ -299,22 +299,20 @@ class BasicBlock final : public Value, // Basic blocks are data objects also /// Returns a pointer to the first instruction in this block that is not a /// PHINode or a debug intrinsic, or any pseudo operation if \c SkipPseudoOp /// is true. - const Instruction *getFirstNonPHIOrDbg(bool SkipPseudoOp = true) const; - Instruction *getFirstNonPHIOrDbg(bool SkipPseudoOp = true) { - return const_cast<Instruction *>( - static_cast<const BasicBlock *>(this)->getFirstNonPHIOrDbg( - SkipPseudoOp)); + InstListType::const_iterator getFirstNonPHIOrDbg(bool SkipPseudoOp = true) const; + InstListType::iterator getFirstNonPHIOrDbg(bool SkipPseudoOp = true) { + return static_cast<const BasicBlock *>(this)->getFirstNonPHIOrDbg( + SkipPseudoOp).getNonConst(); } /// Returns a pointer to the first instruction in this block that is not a /// PHINode, a debug intrinsic, or a lifetime intrinsic, or any pseudo /// operation if \c SkipPseudoOp is true. - const Instruction * + InstListType::const_iterator getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp = true) const; - Instruction *getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp = true) { - return const_cast<Instruction *>( - static_cast<const BasicBlock *>(this)->getFirstNonPHIOrDbgOrLifetime( - SkipPseudoOp)); + InstListType::iterator getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp = true) { + return static_cast<const BasicBlock *>(this)->getFirstNonPHIOrDbgOrLifetime( + SkipPseudoOp).getNonConst(); } /// Returns an iterator to the first instruction in this block that is diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index 7e9d705a7bef6c..fcd00d0558b713 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -990,7 +990,7 @@ bool CodeGenPrepare::isMergingEmptyBlockProfitable(BasicBlock *BB, isa<IndirectBrInst>(Pred->getTerminator()))) return true; - if (BB->getTerminator() != BB->getFirstNonPHIOrDbg()) + if (BB->getTerminator() != &*BB->getFirstNonPHIOrDbg()) return true; // We use a simple cost heuristic which determine skipping merging is diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index 0efc04cb2c8679..62cf9970ad3ff4 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -383,7 +383,8 @@ BasicBlock::const_iterator BasicBlock::getFirstNonPHIIt() const { return It; } -const Instruction *BasicBlock::getFirstNonPHIOrDbg(bool SkipPseudoOp) const { +BasicBlock::const_iterator +BasicBlock::getFirstNonPHIOrDbg(bool SkipPseudoOp) const { for (const Instruction &I : *this) { if (isa<PHINode>(I) || isa<DbgInfoIntrinsic>(I)) continue; @@ -391,12 +392,15 @@ const Instruction *BasicBlock::getFirstNonPHIOrDbg(bool SkipPseudoOp) const { if (SkipPseudoOp && isa<PseudoProbeInst>(I)) continue; - return &I; + BasicBlock::const_iterator It = I.getIterator(); + // Signal that this comes after any debug records. + It.setHeadBit(false); + return It; } - return nullptr; + return end(); } -const Instruction * +BasicBlock::const_iterator BasicBlock::getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp) const { for (const Instruction &I : *this) { if (isa<PHINode>(I) || isa<DbgInfoIntrinsic>(I)) @@ -408,9 +412,13 @@ BasicBlock::getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp) const { if (SkipPseudoOp && isa<PseudoProbeInst>(I)) continue; - return &I; + BasicBlock::const_iterator It = I.getIterator(); + // Signal that this comes after any debug records. + It.setHeadBit(false); + return It; + } - return nullptr; + return end(); } BasicBlock::const_iterator BasicBlock::getFirstInsertionPt() const { @@ -428,11 +436,10 @@ BasicBlock::const_iterator BasicBlock::getFirstInsertionPt() const { } BasicBlock::const_iterator BasicBlock::getFirstNonPHIOrDbgOrAlloca() const { - const Instruction *FirstNonPHI = getFirstNonPHI(); - if (!FirstNonPHI) + const_iterator InsertPt = getFirstNonPHIIt(); + if (InsertPt == end()) return end(); - const_iterator InsertPt = FirstNonPHI->getIterator(); if (InsertPt->isEHPad()) ++InsertPt; @@ -448,6 +455,9 @@ BasicBlock::const_iterator BasicBlock::getFirstNonPHIOrDbgOrAlloca() const { ++InsertPt; } } + + // Signal that this comes after any debug records. + InsertPt.setHeadBit(false); return InsertPt; } diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index e2389145cf33f2..aae2fdaf5bec37 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -2188,7 +2188,7 @@ static std::optional<Instruction *> instCombineDMB(InstCombiner &IC, NI = NI->getNextNonDebugInstruction(); if (!NI) { if (auto *SuccBB = NIBB->getUniqueSuccessor()) - NI = SuccBB->getFirstNonPHIOrDbgOrLifetime(); + NI = &*SuccBB->getFirstNonPHIOrDbgOrLifetime(); else break; } diff --git a/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp b/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp index 4ff6fc32b642dd..df0c2080e0795d 100644 --- a/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp +++ b/llvm/lib/Target/AMDGPU/SIAnnotateControlFlow.cpp @@ -232,7 +232,7 @@ Value *SIAnnotateControlFlow::handleLoopCondition( } else if (L->contains(Inst)) { Insert = Term; } else { - Insert = L->getHeader()->getFirstNonPHIOrDbgOrLifetime(); + Insert = &*L->getHeader()->getFirstNonPHIOrDbgOrLifetime(); } return CreateBreak(Insert); @@ -247,7 +247,7 @@ Value *SIAnnotateControlFlow::handleLoopCondition( } if (isa<Argument>(Cond)) { - Instruction *Insert = L->getHeader()->getFirstNonPHIOrDbgOrLifetime(); + Instruction *Insert = &*L->getHeader()->getFirstNonPHIOrDbgOrLifetime(); return CreateBreak(Insert); } diff --git a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp index 75fcf6829c5042..c734d3d4300737 100644 --- a/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp @@ -86,7 +86,7 @@ bool GenericToNVVM::runOnModule(Module &M) { if (F.isDeclaration()) { continue; } - IRBuilder<> Builder(F.getEntryBlock().getFirstNonPHIOrDbg()); + IRBuilder<> Builder(&*F.getEntryBlock().getFirstNonPHIOrDbg()); for (BasicBlock &BB : F) { for (Instruction &II : BB) { for (unsigned i = 0, e = II.getNumOperands(); i < e; ++i) { diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp index 73d4fb9065831e..1195478fdff4cc 100644 --- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -1656,7 +1656,8 @@ static Value *emitSetAndGetSwiftErrorValueAround(Instruction *Call, Builder.SetInsertPoint(Call->getNextNode()); } else { auto Invoke = cast<InvokeInst>(Call); - Builder.SetInsertPoint(Invoke->getNormalDest()->getFirstNonPHIOrDbg()); + BasicBlock::iterator It = Invoke->getNormalDest()->getFirstNonPHIOrDbg(); + Builder.SetInsertPoint(It); } // Get the current swifterror value and store it to the alloca. @@ -1697,7 +1698,7 @@ static void eliminateSwiftErrorAlloca(Function &F, AllocaInst *Alloca, static void eliminateSwiftErrorArgument(Function &F, Argument &Arg, coro::Shape &Shape, SmallVectorImpl<AllocaInst*> &AllocasToPromote) { - IRBuilder<> Builder(F.getEntryBlock().getFirstNonPHIOrDbg()); + IRBuilder<> Builder(&F.getEntryBlock(), F.getEntryBlock().getFirstNonPHIOrDbg()); auto ArgTy = cast<PointerType>(Arg.getType()); auto ValueTy = PointerType::getUnqual(F.getContext()); diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp index ff5df12c398c56..3bf412e4e54a11 100644 --- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp @@ -597,7 +597,7 @@ static void replaceSwiftErrorOps(Function &F, coro::Shape &Shape, } // Create a swifterror alloca. - IRBuilder<> Builder(F.getEntryBlock().getFirstNonPHIOrDbg()); + IRBuilder<> Builder(&F.getEntryBlock(), F.getEntryBlock().getFirstNonPHIOrDbg()); auto Alloca = Builder.CreateAlloca(ValueTy); Alloca->setSwiftError(true); diff --git a/llvm/lib/Transforms/IPO/IROutliner.cpp b/llvm/lib/Transforms/IPO/IROutliner.cpp index 3f54106bd09fe9..41bc67f2b6891b 100644 --- a/llvm/lib/Transforms/IPO/IROutliner.cpp +++ b/llvm/lib/Transforms/IPO/IROutliner.cpp @@ -197,7 +197,7 @@ Value *OutlinableRegion::findCorrespondingValueIn(const OutlinableRegion &Other, BasicBlock * OutlinableRegion::findCorrespondingBlockIn(const OutlinableRegion &Other, BasicBlock *BB) { - Instruction *FirstNonPHI = BB->getFirstNonPHIOrDbg(); + Instruction *FirstNonPHI = &*BB->getFirstNonPHIOrDbg(); assert(FirstNonPHI && "block is empty?"); Value *CorrespondingVal = findCorrespondingValueIn(Other, FirstNonPHI); if (!CorrespondingVal) diff --git a/llvm/lib/Transforms/IPO/SCCP.cpp b/llvm/lib/Transforms/IPO/SCCP.cpp index e80c6f7c0f49d4..2afcdf09af0162 100644 --- a/llvm/lib/Transforms/IPO/SCCP.cpp +++ b/llvm/lib/Transforms/IPO/SCCP.cpp @@ -235,11 +235,11 @@ static bool runIPSCCP( // nodes in executable blocks we found values for. The function's entry // block is not part of BlocksToErase, so we have to handle it separately. for (BasicBlock *BB : BlocksToErase) { - NumInstRemoved += changeToUnreachable(BB->getFirstNonPHIOrDbg(), + NumInstRemoved += changeToUnreachable(&*BB->getFirstNonPHIOrDbg(), /*PreserveLCSSA=*/false, &DTU); } if (!Solver.isBlockExecutable(&F.front())) - NumInstRemoved += changeToUnreachable(F.front().getFirstNonPHIOrDbg(), + NumInstRemoved += changeToUnreachable(&*F.front().getFirstNonPHIOrDbg(), /*PreserveLCSSA=*/false, &DTU); BasicBlock *NewUnreachableBB = nullptr; diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp index b978c54ef96fdf..e1d5b07405a095 100644 --- a/llvm/lib/Transforms/IPO/SampleProfile.cpp +++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp @@ -1747,7 +1747,7 @@ void SampleProfileLoader::generateMDProfMetadata(Function &F) { if (Weight != 0) { if (Weight > MaxWeight) { MaxWeight = Weight; - MaxDestInst = Succ->getFirstNonPHIOrDbgOrLifetime(); + MaxDestInst = &*Succ->getFirstNonPHIOrDbgOrLifetime(); } } } diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index f80bbffbab547e..4b42e86e25161b 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -462,8 +462,8 @@ Instruction *InstCombinerImpl::visitAllocaInst(AllocaInst &AI) { // Get the first instruction in the entry block. BasicBlock &EntryBlock = AI.getParent()->getParent()->getEntryBlock(); - Instruction *FirstInst = EntryBlock.getFirstNonPHIOrDbg(); - if (FirstInst != &AI) { + BasicBlock::iterator FirstInst = EntryBlock.getFirstNonPHIOrDbg(); + if (&*FirstInst != &AI) { // If the entry block doesn't start with a zero-size alloca then move // this one to the start of the entry block. There is no problem with // dominance as the array size was forced to a constant earlier already. diff --git a/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp b/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp index bbc7a005b9ff4f..350b0c3754bb5e 100644 --- a/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp +++ b/llvm/lib/Transforms/Scalar/CallSiteSplitting.cpp @@ -415,7 +415,7 @@ static void splitCallSite(CallBase &CB, // constant incoming values. static bool isPredicatedOnPHI(CallBase &CB) { BasicBlock *Parent = CB.getParent(); - if (&CB != Parent->getFirstNonPHIOrDbg()) + if (&CB != &*Parent->getFirstNonPHIOrDbg()) return false; for (auto &PN : Parent->phis()) { diff --git a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp index c2f7c5dcaf1603..bcc56203a4beaf 100644 --- a/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp +++ b/llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp @@ -770,7 +770,7 @@ static bool unswitchTrivialSwitch(Loop &L, SwitchInst &SI, DominatorTree &DT, // instruction in the block. auto *TI = BBToCheck.getTerminator(); bool isUnreachable = isa<UnreachableInst>(TI); - return !isUnreachable || BBToCheck.getFirstNonPHIOrDbg() != TI; + return !isUnreachable || &*BBToCheck.getFirstNonPHIOrDbg() != TI; }; SmallVector<int, 4> ExitCaseIndices; diff --git a/llvm/lib/Transforms/Utils/CodeMoverUtils.cpp b/llvm/lib/Transforms/Utils/CodeMoverUtils.cpp index f34e9c5818dd67..b0105ae8fa1168 100644 --- a/llvm/lib/Transforms/Utils/CodeMoverUtils.cpp +++ b/llvm/lib/Transforms/Utils/CodeMoverUtils.cpp @@ -427,7 +427,7 @@ void llvm::moveInstructionsToTheBeginning(BasicBlock &FromBB, BasicBlock &ToBB, DependenceInfo &DI) { for (Instruction &I : llvm::make_early_inc_range(llvm::drop_begin(llvm::reverse(FromBB)))) { - Instruction *MovePos = ToBB.getFirstNonPHIOrDbg(); + BasicBlock::iterator MovePos = ToBB.getFirstNonPHIOrDbg(); if (isSafeToMoveBefore(I, *MovePos, DT, &PDT, &DI)) I.moveBeforePreserving(MovePos); diff --git a/llvm/lib/Transforms/Utils/IRNormalizer.cpp b/llvm/lib/Transforms/Utils/IRNormalizer.cpp index 47ec7f3177db73..d36da331fedf72 100644 --- a/llvm/lib/Transforms/Utils/IRNormalizer.cpp +++ b/llvm/lib/Transforms/Utils/IRNormalizer.cpp @@ -475,7 +475,7 @@ void IRNormalizer::reorderInstructions(Function &F) const { Call->getIntrinsicID() == Intrinsic::experimental_convergence_loop) FirstNonPHIOrDbgOrAlloca++; } - Instruction->moveBefore(&*FirstNonPHIOrDbgOrAlloca); + Instruction->moveBefore(FirstNonPHIOrDbgOrAlloca); TopologicalSort.pop(); } } diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index cf3c2b360d0905..9cc754e71c0e46 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -6004,7 +6004,7 @@ static bool eliminateDeadSwitchCases(SwitchInst *SI, DomTreeUpdater *DTU, /// the phi node, and set PhiIndex to BB's index in the phi node. static PHINode *findPHIForConditionForwarding(ConstantInt *CaseValue, BasicBlock *BB, int *PhiIndex) { - if (BB->getFirstNonPHIOrDbg() != BB->getTerminator()) + if (&*BB->getFirstNonPHIIt() != BB->getTerminator()) return nullptr; // BB must be empty to be a candidate for simplification. if (!BB->getSinglePredecessor()) return nullptr; // BB must be dominated by the switch. @@ -7885,7 +7885,7 @@ bool SimplifyCFGOpt::simplifyUncondBranch(BranchInst *BI, Options.NeedCanonicalLoop && (!LoopHeaders.empty() && BB->hasNPredecessorsOrMore(2) && (is_contained(LoopHeaders, BB) || is_contained(LoopHeaders, Succ))); - BasicBlock::iterator I = BB->getFirstNonPHIOrDbg(true)->getIterator(); + BasicBlock::iterator I = BB->getFirstNonPHIOrDbg(); if (I->isTerminator() && BB != &BB->getParent()->getEntryBlock() && !NeedCanonicalLoop && TryToSimplifyUncondBranchFromEmptyBlock(BB, DTU)) return true; diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp index 42616155f0cc32..c7fea4ab33372a 100644 --- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp +++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp @@ -4643,9 +4643,11 @@ TEST_F(OpenMPIRBuilderTest, CreateTeamsWithThreadLimit) { dyn_cast<BranchInst>(PushNumTeamsCallInst->getNextNonDebugInstruction()); ASSERT_NE(BrInst, nullptr); ASSERT_EQ(BrInst->getNumSuccessors(), 1U); - Instruction *NextInstruction = + BasicBlock::iterator NextInstruction = BrInst->getSuccessor(0)->getFirstNonPHIOrDbgOrLifetime(); - CallInst *ForkTeamsCI = dyn_cast_if_present<CallInst>(NextInstruction); + CallInst *ForkTeamsCI = nullptr; + if (NextInstruction != BrInst->getSuccessor(0)->end()) + ForkTeamsCI = dyn_cast_if_present<CallInst>(NextInstruction); ASSERT_NE(ForkTeamsCI, nullptr); EXPECT_EQ(ForkTeamsCI->getCalledFunction(), OMPBuilder.getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_fork_teams)); @@ -4698,9 +4700,11 @@ TEST_F(OpenMPIRBuilderTest, CreateTeamsWithNumTeamsUpper) { dyn_cast<BranchInst>(PushNumTeamsCallInst->getNextNonDebugInstruction()); ASSERT_NE(BrInst, nullptr); ASSERT_EQ(BrInst->getNumSuccessors(), 1U); - Instruction *NextInstruction = + BasicBlock::iterator NextInstruction = BrInst->getSuccessor(0)->getFirstNonPHIOrDbgOrLifetime(); - CallInst *ForkTeamsCI = dyn_cast_if_present<CallInst>(NextInstruction); + CallInst *ForkTeamsCI = nullptr; + if (NextInstruction != BrInst->getSuccessor(0)->end()) + ForkTeamsCI = dyn_cast_if_present<CallInst>(NextInstruction); ASSERT_NE(ForkTeamsCI, nullptr); EXPECT_EQ(ForkTeamsCI->getCalledFunction(), OMPBuilder.getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_fork_teams)); @@ -4756,9 +4760,11 @@ TEST_F(OpenMPIRBuilderTest, CreateTeamsWithNumTeamsBoth) { dyn_cast<BranchInst>(PushNumTeamsCallInst->getNextNonDebugInstruction()); ASSERT_NE(BrInst, nullptr); ASSERT_EQ(BrInst->getNumSuccessors(), 1U); - Instruction *NextInstruction = + BasicBlock::iterator NextInstruction = BrInst->getSuccessor(0)->getFirstNonPHIOrDbgOrLifetime(); - CallInst *ForkTeamsCI = dyn_cast_if_present<CallInst>(NextInstruction); + CallInst *ForkTeamsCI = nullptr; + if (NextInstruction != BrInst->getSuccessor(0)->end()) + ForkTeamsCI = dyn_cast_if_present<CallInst>(NextInstruction); ASSERT_NE(ForkTeamsCI, nullptr); EXPECT_EQ(ForkTeamsCI->getCalledFunction(), OMPBuilder.getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_fork_teams)); @@ -4820,9 +4826,11 @@ TEST_F(OpenMPIRBuilderTest, CreateTeamsWithNumTeamsAndThreadLimit) { dyn_cast<BranchInst>(PushNumTeamsCallInst->getNextNonDebugInstruction()); ASSERT_NE(BrInst, nullptr); ASSERT_EQ(BrInst->getNumSuccessors(), 1U); - Instruction *NextInstruction = + BasicBlock::iterator NextInstruction = BrInst->getSuccessor(0)->getFirstNonPHIOrDbgOrLifetime(); - CallInst *ForkTeamsCI = dyn_cast_if_present<CallInst>(NextInstruction); + CallInst *ForkTeamsCI = nullptr; + if (NextInstruction != BrInst->getSuccessor(0)->end()) + ForkTeamsCI = dyn_cast_if_present<CallInst>(NextInstruction); ASSERT_NE(ForkTeamsCI, nullptr); EXPECT_EQ(ForkTeamsCI->getCalledFunction(), OMPBuilder.getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_fork_teams)); >From 553e575db7752b7c17389844f1211923b8fd4520 Mon Sep 17 00:00:00 2001 From: Jeremy Morse <jeremy.mo...@sony.com> Date: Mon, 27 Jan 2025 16:04:22 +0000 Subject: [PATCH 2/2] review feedback --- llvm/lib/IR/BasicBlock.cpp | 11 +++++++---- llvm/lib/Transforms/Coroutines/CoroFrame.cpp | 3 +-- llvm/lib/Transforms/Coroutines/CoroSplit.cpp | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/llvm/lib/IR/BasicBlock.cpp b/llvm/lib/IR/BasicBlock.cpp index 62cf9970ad3ff4..97116f602f70aa 100644 --- a/llvm/lib/IR/BasicBlock.cpp +++ b/llvm/lib/IR/BasicBlock.cpp @@ -393,8 +393,9 @@ BasicBlock::getFirstNonPHIOrDbg(bool SkipPseudoOp) const { continue; BasicBlock::const_iterator It = I.getIterator(); - // Signal that this comes after any debug records. - It.setHeadBit(false); + // This position comes after any debug records, the head bit should remain + // unset. + assert(!It.getHeadBit()); return It; } return end(); @@ -413,8 +414,10 @@ BasicBlock::getFirstNonPHIOrDbgOrLifetime(bool SkipPseudoOp) const { continue; BasicBlock::const_iterator It = I.getIterator(); - // Signal that this comes after any debug records. - It.setHeadBit(false); + // This position comes after any debug records, the head bit should remain + // unset. + assert(!It.getHeadBit()); + return It; } diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp index 1195478fdff4cc..5863fa70deee7a 100644 --- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp @@ -1656,8 +1656,7 @@ static Value *emitSetAndGetSwiftErrorValueAround(Instruction *Call, Builder.SetInsertPoint(Call->getNextNode()); } else { auto Invoke = cast<InvokeInst>(Call); - BasicBlock::iterator It = Invoke->getNormalDest()->getFirstNonPHIOrDbg(); - Builder.SetInsertPoint(It); + Builder.SetInsertPoint(Invoke->getNormalDest()->getFirstNonPHIOrDbg()); } // Get the current swifterror value and store it to the alloca. diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp index 3bf412e4e54a11..a81b88c1326f3c 100644 --- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp +++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp @@ -828,7 +828,7 @@ static void updateScopeLine(Instruction *ActiveSuspend, // instructions are not in the same BB. if (auto *Branch = dyn_cast_or_null<BranchInst>(Successor); Branch && Branch->isUnconditional()) - Successor = Branch->getSuccessor(0)->getFirstNonPHIOrDbg(); + Successor = &*Branch->getSuccessor(0)->getFirstNonPHIOrDbg(); // Find the first successor of ActiveSuspend with a non-zero line location. // If that matches the file of ActiveSuspend, use it. _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits