llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-ir @llvm/pr-subscribers-backend-webassembly Author: Jeremy Morse (jmorse) <details> <summary>Changes</summary> (NB: this will fail CI as it composes with #<!-- -->123583, but I'm not gluing them together or it'll be too hard to review). As part of the "RemoveDIs" project, BasicBlock::iterator now carries a debug-info bit that's needed when getFirstNonPHI and similar feed into instruction insertion positions. Call-sites where that's necessary were updated a year ago; but to ensure some type safety however, we'd like to have all calls to getFirstNonPHI use the iterator-returning version. This patch changes a bunch of call-sites calling getFirstNonPHI to use getFirstNonPHIIt, which returns an iterator. All these call sites are where it's obviously safe to fetch the iterator then dereference it. A follow-up patch will contain less-obviously-safe changes. We'll eventually deprecate and remove the instruction-pointer getFirstNonPHI, but not before adding concise documentation of what considerations are needed (very few). --- Patch is 88.59 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/123737.diff 64 Files Affected: - (modified) clang/lib/CodeGen/CGException.cpp (+4-3) - (modified) clang/lib/CodeGen/MicrosoftCXXABI.cpp (+1-1) - (modified) llvm/include/llvm/IR/BasicBlock.h (+1-1) - (modified) llvm/include/llvm/Transforms/Utils/Instrumentation.h (+5) - (modified) llvm/lib/Analysis/Loads.cpp (+1-1) - (modified) llvm/lib/Analysis/LoopNestAnalysis.cpp (+1-1) - (modified) llvm/lib/Analysis/MustExecute.cpp (+1-1) - (modified) llvm/lib/Analysis/ValueTracking.cpp (+1-1) - (modified) llvm/lib/CodeGen/AsmPrinter/WinException.cpp (+2-2) - (modified) llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp (+3-3) - (modified) llvm/lib/CodeGen/GlobalMerge.cpp (+1-1) - (modified) llvm/lib/CodeGen/MachineFunction.cpp (+2-1) - (modified) llvm/lib/CodeGen/SelectOptimize.cpp (+1-1) - (modified) llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp (+3-3) - (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (+2-2) - (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (+4-5) - (modified) llvm/lib/CodeGen/WasmEHPrepare.cpp (+5-5) - (modified) llvm/lib/CodeGen/WinEHPrepare.cpp (+30-28) - (modified) llvm/lib/IR/EHPersonalities.cpp (+1-1) - (modified) llvm/lib/IR/Instructions.cpp (+1-1) - (modified) llvm/lib/IR/Verifier.cpp (+10-10) - (modified) llvm/lib/Target/BPF/BPFAdjustOpt.cpp (+1-1) - (modified) llvm/lib/Target/Hexagon/HexagonLoopIdiomRecognition.cpp (+1-2) - (modified) llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp (+2-2) - (modified) llvm/lib/Target/X86/X86WinEHState.cpp (+3-3) - (modified) llvm/lib/Transforms/Coroutines/MaterializationUtils.cpp (+3-3) - (modified) llvm/lib/Transforms/IPO/IROutliner.cpp (+1-1) - (modified) llvm/lib/Transforms/IPO/PartialInlining.cpp (+1-1) - (modified) llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp (+3-3) - (modified) llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp (+3-2) - (modified) llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp (+3-1) - (modified) llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp (+3-3) - (modified) llvm/lib/Transforms/Instrumentation/PGOMemOPSizeOpt.cpp (+1-1) - (modified) llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp (+6-2) - (modified) llvm/lib/Transforms/ObjCARC/ObjCARC.cpp (+2-2) - (modified) llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp (+1-1) - (modified) llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp (+2-1) - (modified) llvm/lib/Transforms/Scalar/GVN.cpp (+2-1) - (modified) llvm/lib/Transforms/Scalar/GVNSink.cpp (+1-1) - (modified) llvm/lib/Transforms/Scalar/LICM.cpp (+4-3) - (modified) llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp (+6-6) - (modified) llvm/lib/Transforms/Scalar/LoopInterchange.cpp (+9-8) - (modified) llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp (+1-1) - (modified) llvm/lib/Transforms/Scalar/SCCP.cpp (+1-1) - (modified) llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp (+3-3) - (modified) llvm/lib/Transforms/Utils/CodeExtractor.cpp (+3-3) - (modified) llvm/lib/Transforms/Utils/InlineFunction.cpp (+24-23) - (modified) llvm/lib/Transforms/Utils/Local.cpp (+3-3) - (modified) llvm/lib/Transforms/Utils/LoopSimplify.cpp (+1-1) - (modified) llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp (+9-4) - (modified) llvm/lib/Transforms/Utils/MoveAutoInit.cpp (+1-1) - (modified) llvm/lib/Transforms/Utils/SSAUpdater.cpp (+3-2) - (modified) llvm/lib/Transforms/Vectorize/LoopVectorize.cpp (+3-3) - (modified) llvm/lib/Transforms/Vectorize/VPlan.cpp (+3-4) - (modified) llvm/tools/llvm-reduce/deltas/ReduceBasicBlocks.cpp (+1-1) - (modified) llvm/unittests/Analysis/MemorySSATest.cpp (+1-1) - (modified) llvm/unittests/Analysis/ProfileSummaryInfoTest.cpp (+5-5) - (modified) llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp (+8-8) - (modified) llvm/unittests/IR/DebugInfoTest.cpp (+5-5) - (modified) llvm/unittests/IR/InstructionsTest.cpp (+2-2) - (modified) llvm/unittests/Transforms/Scalar/LICMTest.cpp (+2-2) - (modified) polly/lib/CodeGen/BlockGenerators.cpp (+4-4) - (modified) polly/lib/CodeGen/LoopGenerators.cpp (+1-1) - (modified) polly/lib/Transform/MaximalStaticExpansion.cpp (+2-2) ``````````diff diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index e7dd5fb01ebede..75f6f6c44e1fd9 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -1251,11 +1251,12 @@ void CodeGenFunction::ExitCXXTryStmt(const CXXTryStmt &S, bool IsFnTryBlock) { llvm::BasicBlock *WasmCatchStartBlock = nullptr; if (EHPersonality::get(*this).isWasmPersonality()) { auto *CatchSwitch = - cast<llvm::CatchSwitchInst>(DispatchBlock->getFirstNonPHI()); + cast<llvm::CatchSwitchInst>(DispatchBlock->getFirstNonPHIIt()); WasmCatchStartBlock = CatchSwitch->hasUnwindDest() ? CatchSwitch->getSuccessor(1) : CatchSwitch->getSuccessor(0); - auto *CPI = cast<llvm::CatchPadInst>(WasmCatchStartBlock->getFirstNonPHI()); + auto *CPI = + cast<llvm::CatchPadInst>(WasmCatchStartBlock->getFirstNonPHIIt()); CurrentFuncletPad = CPI; } @@ -2252,7 +2253,7 @@ void CodeGenFunction::ExitSEHTryStmt(const SEHTryStmt &S) { // __except blocks don't get outlined into funclets, so immediately do a // catchret. llvm::CatchPadInst *CPI = - cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHI()); + cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHIIt()); llvm::BasicBlock *ExceptBB = createBasicBlock("__except"); Builder.CreateCatchRet(CPI, ExceptBB); EmitBlock(ExceptBB); diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index 90651c3bafe26e..0d53e8cb45fe77 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -918,7 +918,7 @@ void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF, VarDecl *CatchParam = S->getExceptionDecl(); llvm::BasicBlock *CatchPadBB = CGF.Builder.GetInsertBlock(); llvm::CatchPadInst *CPI = - cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHI()); + cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHIIt()); CGF.CurrentFuncletPad = CPI; // If this is a catch-all or the catch parameter is unnamed, we don't need to diff --git a/llvm/include/llvm/IR/BasicBlock.h b/llvm/include/llvm/IR/BasicBlock.h index c7913e60cea083..a6cda04b39e605 100644 --- a/llvm/include/llvm/IR/BasicBlock.h +++ b/llvm/include/llvm/IR/BasicBlock.h @@ -672,7 +672,7 @@ class BasicBlock final : public Value, // Basic blocks are data objects also void replaceSuccessorsPhiUsesWith(BasicBlock *New); /// Return true if this basic block is an exception handling block. - bool isEHPad() const { return getFirstNonPHI()->isEHPad(); } + bool isEHPad() const { return getFirstNonPHIIt()->isEHPad(); } /// Return true if this basic block is a landing pad. /// diff --git a/llvm/include/llvm/Transforms/Utils/Instrumentation.h b/llvm/include/llvm/Transforms/Utils/Instrumentation.h index 4f67d079d14696..0e2c0d9bfa605a 100644 --- a/llvm/include/llvm/Transforms/Utils/Instrumentation.h +++ b/llvm/include/llvm/Transforms/Utils/Instrumentation.h @@ -204,6 +204,11 @@ struct InstrumentationIRBuilder : IRBuilder<> { explicit InstrumentationIRBuilder(Instruction *IP) : IRBuilder<>(IP) { ensureDebugInfo(*this, *IP->getFunction()); } + + explicit InstrumentationIRBuilder(BasicBlock *BB, BasicBlock::iterator It) + : IRBuilder<>(BB, It) { + ensureDebugInfo(*this, *BB->getParent()); + } }; } // end namespace llvm diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp index 11ccfa33821cad..9279f19b72a3f1 100644 --- a/llvm/lib/Analysis/Loads.cpp +++ b/llvm/lib/Analysis/Loads.cpp @@ -284,7 +284,7 @@ bool llvm::isDereferenceableAndAlignedInLoop( DL.getTypeStoreSize(LI->getType()).getFixedValue()); const Align Alignment = LI->getAlign(); - Instruction *HeaderFirstNonPHI = L->getHeader()->getFirstNonPHI(); + Instruction *HeaderFirstNonPHI = &*L->getHeader()->getFirstNonPHIIt(); // If given a uniform (i.e. non-varying) address, see if we can prove the // access is safe within the loop w/o needing predication. diff --git a/llvm/lib/Analysis/LoopNestAnalysis.cpp b/llvm/lib/Analysis/LoopNestAnalysis.cpp index fe6d270b9ac53c..ead5cf610d9e11 100644 --- a/llvm/lib/Analysis/LoopNestAnalysis.cpp +++ b/llvm/lib/Analysis/LoopNestAnalysis.cpp @@ -346,7 +346,7 @@ static bool checkLoopsStructure(const Loop &OuterLoop, const Loop &InnerLoop, // "guarded" inner loop which contains "only" Phi nodes corresponding to the // LCSSA Phi nodes in the exit block. auto IsExtraPhiBlock = [&](const BasicBlock &BB) { - return BB.getFirstNonPHI() == BB.getTerminator() && + return &*BB.getFirstNonPHIIt() == BB.getTerminator() && all_of(BB.phis(), [&](const PHINode &PN) { return all_of(PN.blocks(), [&](const BasicBlock *IncomingBlock) { return IncomingBlock == InnerLoopExit || diff --git a/llvm/lib/Analysis/MustExecute.cpp b/llvm/lib/Analysis/MustExecute.cpp index d5c665753075ce..fde6bbf9eb1817 100644 --- a/llvm/lib/Analysis/MustExecute.cpp +++ b/llvm/lib/Analysis/MustExecute.cpp @@ -275,7 +275,7 @@ bool SimpleLoopSafetyInfo::isGuaranteedToExecute(const Instruction &Inst, // exit. At the moment, we use a (cheap) hack for the common case where // the instruction of interest is the first one in the block. return !HeaderMayThrow || - Inst.getParent()->getFirstNonPHIOrDbg() == &Inst; + &*Inst.getParent()->getFirstNonPHIOrDbg() == &Inst; // If there is a path from header to exit or latch that doesn't lead to our // instruction's block, return false. diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 6e2f0ebde9bb6c..3526253085e0b7 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -8239,7 +8239,7 @@ static bool programUndefinedIfUndefOrPoison(const Value *V, if (!BB || !Visited.insert(BB).second) break; - Begin = BB->getFirstNonPHI()->getIterator(); + Begin = BB->getFirstNonPHIIt(); End = BB->end(); } return false; diff --git a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp index 6d6432b61f2d7d..97b4a6a42d81db 100644 --- a/llvm/lib/CodeGen/AsmPrinter/WinException.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/WinException.cpp @@ -928,8 +928,8 @@ void WinException::computeIP2StateTable( BaseState = NullState; StartLabel = Asm->getFunctionBegin(); } else { - auto *FuncletPad = - cast<FuncletPadInst>(FuncletStart->getBasicBlock()->getFirstNonPHI()); + auto *FuncletPad = cast<FuncletPadInst>( + FuncletStart->getBasicBlock()->getFirstNonPHIIt()); assert(FuncInfo.FuncletBaseStateMap.count(FuncletPad) != 0); BaseState = FuncInfo.FuncletBaseStateMap.find(FuncletPad)->second; StartLabel = getMCSymbolForMBB(Asm, &*FuncletStart); diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index f668e41094bbc8..21622ea43724c1 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -2866,7 +2866,7 @@ bool IRTranslator::findUnwindDestinations( } while (EHPadBB) { - const Instruction *Pad = EHPadBB->getFirstNonPHI(); + BasicBlock::const_iterator Pad = EHPadBB->getFirstNonPHIIt(); BasicBlock *NewEHPadBB = nullptr; if (isa<LandingPadInst>(Pad)) { // Stop on landingpads. They are not funclets. @@ -2927,7 +2927,7 @@ bool IRTranslator::translateInvoke(const User &U, return false; // FIXME: support Windows exception handling. - if (!isa<LandingPadInst>(EHPadBB->getFirstNonPHI())) + if (!isa<LandingPadInst>(EHPadBB->getFirstNonPHIIt())) return false; // FIXME: support Windows dllimport function calls and calls through @@ -4031,7 +4031,7 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &CurMF) { MF->push_back(EntryBB); EntryBuilder->setMBB(*EntryBB); - DebugLoc DbgLoc = F.getEntryBlock().getFirstNonPHI()->getDebugLoc(); + DebugLoc DbgLoc = F.getEntryBlock().getFirstNonPHIIt()->getDebugLoc(); SwiftError.setFunction(CurMF); SwiftError.createEntriesInEntryBlock(DbgLoc); diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp index 48d4d7848d84a7..a7b02aa663a194 100644 --- a/llvm/lib/CodeGen/GlobalMerge.cpp +++ b/llvm/lib/CodeGen/GlobalMerge.cpp @@ -632,7 +632,7 @@ void GlobalMergeImpl::setMustKeepGlobalVariables(Module &M) { for (Function &F : M) { for (BasicBlock &BB : F) { - Instruction *Pad = BB.getFirstNonPHI(); + BasicBlock::iterator Pad = BB.getFirstNonPHIIt(); auto *II = dyn_cast<IntrinsicInst>(Pad); if (!Pad->isEHPad() && !(II && II->getIntrinsicID() == Intrinsic::eh_typeid_for)) diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp index b8dbe834a4d511..6196bcc478b6fe 100644 --- a/llvm/lib/CodeGen/MachineFunction.cpp +++ b/llvm/lib/CodeGen/MachineFunction.cpp @@ -833,7 +833,8 @@ MCSymbol *MachineFunction::addLandingPad(MachineBasicBlock *LandingPad) { LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); LP.LandingPadLabel = LandingPadLabel; - const Instruction *FirstI = LandingPad->getBasicBlock()->getFirstNonPHI(); + BasicBlock::const_iterator FirstI = + LandingPad->getBasicBlock()->getFirstNonPHIIt(); if (const auto *LPI = dyn_cast<LandingPadInst>(FirstI)) { // If there's no typeid list specified, then "cleanup" is implicit. // Otherwise, id 0 is reserved for the cleanup action. diff --git a/llvm/lib/CodeGen/SelectOptimize.cpp b/llvm/lib/CodeGen/SelectOptimize.cpp index bfc49dd354aa60..0f5bdea2f12664 100644 --- a/llvm/lib/CodeGen/SelectOptimize.cpp +++ b/llvm/lib/CodeGen/SelectOptimize.cpp @@ -1217,7 +1217,7 @@ bool SelectOptimizeImpl::checkLoopHeuristics(const Loop *L, return true; OptimizationRemarkMissed ORmissL(DEBUG_TYPE, "SelectOpti", - L->getHeader()->getFirstNonPHI()); + &*L->getHeader()->getFirstNonPHIIt()); if (LoopCost[0].NonPredCost > LoopCost[0].PredCost || LoopCost[1].NonPredCost >= LoopCost[1].PredCost) { diff --git a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp index 3e89b18585f153..33c63417444780 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp @@ -250,7 +250,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf, // Don't create MachineBasicBlocks for imaginary EH pad blocks. These blocks // are really data, and no instructions can live here. if (BB.isEHPad()) { - const Instruction *PadInst = BB.getFirstNonPHI(); + BasicBlock::const_iterator PadInst = BB.getFirstNonPHIIt(); // If this is a non-landingpad EH pad, mark this function as using // funclets. // FIXME: SEH catchpads do not create EH scope/funclets, so we could avoid @@ -261,13 +261,13 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf, MF->getFrameInfo().setHasOpaqueSPAdjustment(true); } if (isa<CatchSwitchInst>(PadInst)) { - assert(&*BB.begin() == PadInst && + assert(BB.begin() == PadInst && "WinEHPrepare failed to remove PHIs from imaginary BBs"); continue; } if (isa<FuncletPadInst>(PadInst) && Personality != EHPersonality::Wasm_CXX) - assert(&*BB.begin() == PadInst && "WinEHPrepare failed to demote PHIs"); + assert(BB.begin() == PadInst && "WinEHPrepare failed to demote PHIs"); } MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(&BB); diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 43a182f9b9c195..09b04cdd954dd1 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -2063,7 +2063,7 @@ static void findWasmUnwindDestinations( SmallVectorImpl<std::pair<MachineBasicBlock *, BranchProbability>> &UnwindDests) { while (EHPadBB) { - const Instruction *Pad = EHPadBB->getFirstNonPHI(); + BasicBlock::const_iterator Pad = EHPadBB->getFirstNonPHIIt(); if (isa<CleanupPadInst>(Pad)) { // Stop on cleanup pads. UnwindDests.emplace_back(FuncInfo.getMBB(EHPadBB), Prob); @@ -2111,7 +2111,7 @@ static void findUnwindDestinations( } while (EHPadBB) { - const Instruction *Pad = EHPadBB->getFirstNonPHI(); + BasicBlock::const_iterator Pad = EHPadBB->getFirstNonPHIIt(); BasicBlock *NewEHPadBB = nullptr; if (isa<LandingPadInst>(Pad)) { // Stop on landingpads. They are not funclets. diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index b416e98fe61a8b..c356f5a0fbb079 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1421,7 +1421,7 @@ bool SelectionDAGISel::PrepareEHLandingPad() { // Catchpads have one live-in register, which typically holds the exception // pointer or code. if (isFuncletEHPersonality(Pers)) { - if (const auto *CPI = dyn_cast<CatchPadInst>(LLVMBB->getFirstNonPHI())) { + if (const auto *CPI = dyn_cast<CatchPadInst>(LLVMBB->getFirstNonPHIIt())) { if (hasExceptionPointerOrCodeUser(CPI)) { // Get or create the virtual register to hold the pointer or code. Mark // the live in physreg and copy into the vreg. @@ -1452,7 +1452,7 @@ bool SelectionDAGISel::PrepareEHLandingPad() { MF->getRegInfo().addPhysRegsUsedFromRegMask(RegMask); if (Pers == EHPersonality::Wasm_CXX) { - if (const auto *CPI = dyn_cast<CatchPadInst>(LLVMBB->getFirstNonPHI())) + if (const auto *CPI = dyn_cast<CatchPadInst>(LLVMBB->getFirstNonPHIIt())) mapWasmLandingPadIndex(MBB, CPI); } else { // Assign the call site to the landing pad's begin label. @@ -1721,13 +1721,12 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) { // use anything def'd by or after the tail call. { BasicBlock::iterator BBStart = - const_cast<BasicBlock *>(LLVMBB)->getFirstNonPHI()->getIterator(); + const_cast<BasicBlock *>(LLVMBB)->getFirstNonPHIIt(); BasicBlock::iterator BBEnd = const_cast<BasicBlock *>(LLVMBB)->end(); preserveFakeUses(BBStart, BBEnd); } - BasicBlock::const_iterator const Begin = - LLVMBB->getFirstNonPHI()->getIterator(); + BasicBlock::const_iterator const Begin = LLVMBB->getFirstNonPHIIt(); BasicBlock::const_iterator const End = LLVMBB->end(); BasicBlock::const_iterator BI = End; diff --git a/llvm/lib/CodeGen/WasmEHPrepare.cpp b/llvm/lib/CodeGen/WasmEHPrepare.cpp index 1701b0d04425d2..d18196b2217f58 100644 --- a/llvm/lib/CodeGen/WasmEHPrepare.cpp +++ b/llvm/lib/CodeGen/WasmEHPrepare.cpp @@ -227,7 +227,7 @@ bool WasmEHPrepareImpl::prepareEHPads(Function &F) { for (BasicBlock &BB : F) { if (!BB.isEHPad()) continue; - auto *Pad = BB.getFirstNonPHI(); + BasicBlock::iterator Pad = BB.getFirstNonPHIIt(); if (isa<CatchPadInst>(Pad)) CatchPads.push_back(&BB); else if (isa<CleanupPadInst>(Pad)) @@ -284,7 +284,7 @@ bool WasmEHPrepareImpl::prepareEHPads(Function &F) { unsigned Index = 0; for (auto *BB : CatchPads) { - auto *CPI = cast<CatchPadInst>(BB->getFirstNonPHI()); + auto *CPI = cast<CatchPadInst>(BB->getFirstNonPHIIt()); // In case of a single catch (...), we don't need to emit a personalify // function call if (CPI->arg_size() == 1 && @@ -309,7 +309,7 @@ void WasmEHPrepareImpl::prepareEHPad(BasicBlock *BB, bool NeedPersonality, IRBuilder<> IRB(BB->getContext()); IRB.SetInsertPoint(BB, BB->getFirstInsertionPt()); - auto *FPI = cast<FuncletPadInst>(BB->getFirstNonPHI()); + auto *FPI = cast<FuncletPadInst>(BB->getFirstNonPHIIt()); Instruction *GetExnCI = nullptr, *GetSelectorCI = nullptr; for (auto &U : FPI->uses()) { if (auto *CI = dyn_cast<CallInst>(U.getUser())) { @@ -388,13 +388,13 @@ void llvm::calculateWasmEHInfo(const Function *F, WasmEHFuncInfo &EHInfo) { for (const auto &BB : *F) { if (!BB.isEHPad()) continue; - const Instruction *Pad = BB.getFirstNonPHI(); + const Instruction *Pad = &*BB.getFirstNonPHIIt(); if (const auto *CatchPad = dyn_cast<CatchPadInst>(Pad)) { const auto *UnwindBB = CatchPad->getCatchSwitch()->getUnwindDest(); if (!UnwindBB) continue; - const Instruction *UnwindPad = UnwindBB->getFirstNonPHI(); + const Instruction *UnwindPad = &*UnwindBB->getFirstNonPHIIt(); if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(UnwindPad)) // Currently there should be only one handler per a catchswitch. EHInfo.setUnwindDest(&BB, *CatchSwitch->handlers().begin()); diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp index c58c67b70fe3c2..6d85f078290337 100644 --- a/llvm/lib/CodeGen/WinEHPrepare.cpp +++ b/llvm/lib/CodeGen/WinEHPrepare.cpp @@ -201,7 +201,7 @@ static void calculateStateNumbersForInvokes(const Function *Fn, BasicBlock *FuncletUnwindDest; auto *FuncletPad = - dyn_cast<FuncletPadInst>(FuncletEntryBB->getFirstNonPHI()); + dyn_cast<FuncletPadInst>(FuncletEntryBB->getFirstNonPHIIt()); assert(FuncletPad || FuncletEntryBB == &Fn->getEntryBlock()); if (!FuncletPad) FuncletUnwindDest = nullptr; @@ -223,7 +223,7 @@ static void calculateStateNumbersForInvokes(const Function *Fn, if (BaseState != -1) { FuncInfo.InvokeStateMap[II] = BaseState; } else { - Instruction *PadInst = InvokeUnwindDest->getFirstNonPHI(); + Instruction *PadInst = &*InvokeUnwindDest->getFirstNonPHIIt(); assert(FuncInfo.EHPadStateMap.count(PadInst) && "EH Pad has no state!"); FuncInfo.InvokeStateMap[II] = FuncInfo.EHPadStateMap[PadInst]; } @@ -254,10 +254,10 @@ void llvm::calculateCXXStateForAsynchEH(const BasicBlock *BB, int State, if (EHInfo.BlockToStateMap.count(BB) && EHInfo.BlockToStateMap[BB] <= State) continue; // skip blocks already visited by lower State - const llvm::Instruction *I = BB->getFirstNonPHI(); + BasicBlock::const_iterator It = BB->getFirstNonPHIIt(); const llvm::Instruction *TI = BB->getTerminator(); - if (I->isEHPad()) - State = EHInfo.EHPadStateMap[I]; + if (It->isEHPad()) + State = EHInfo.EHPadStateMap[&*It]; EHInfo.BlockToStateMap[BB] = State; // Record state, also flag visiting if ((isa<CleanupReturnInst>(TI) || isa<CatchReturnInst>(TI)) && State > 0) { @@ -315,15 +315,15 @@ void llvm::calculateSEHStateForAsynchEH(const BasicBlock *BB, int State, if (EHInfo.BlockToStateMap.count(BB) && EHInfo.BlockToStateMap[BB] <= State) continue; // skip blocks already visited by lower State - const llvm::Instruction *I = BB->getFirstNonPHI(); + BasicBlock::const_iterator It = BB->getFirstNonPHIIt(); const llvm::Instruction *TI = BB->getTerminator(); - if (I->isEHPad()) - State = EHInfo.EHPadStateMap[I]; + if (It->isEHPad()) + State = EHInfo.EHPadStateMap[&*It]; EHInfo.BlockToStateMap[BB] = State; // Record state - if (isa<CatchPadInst>(I) && isa<CatchReturnInst>(TI)) { + if (isa<CatchPadInst>(It) && isa<CatchReturnInst>(TI)) { const Constant *FilterOrNull = cast<Constant>( - cast<CatchPadInst>(I)->getArgOperand(0)->stripPointerCasts()); + cast<CatchPadInst>(It)->getArgOperand(0)->stripPointerCasts()); const Function *Filter = dyn_cast<Function>(FilterOrNull); if (!Filter || !Filter->getName().starts_with("__IsLocalUnwind")) State = EHInfo.SEHUnwindMap[State].ToState; // Retrive next State @@ -385,7 +385,7 @@ static void calculateCXXStateNumbers(WinEHFuncInfo &FuncInfo, SmallVector<const CatchPadInst *, 2> Handlers; for (const BasicBlock *CatchPadBB : CatchSwitch->handlers()) { - auto *CatchPad = cast<CatchPadInst>(CatchPadBB->getFirstNonPHI()); + auto *CatchPad = cast<CatchPadInst>(CatchPadBB->getFirstNonPHIIt()); Handlers.push_back(CatchPad); } int TryLow = a... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/123737 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits