https://github.com/jmorse updated https://github.com/llvm/llvm-project/pull/102006
>From cf967317327aa3971da62a15f357ee5b29268f14 Mon Sep 17 00:00:00 2001 From: Jeremy Morse <jeremy.mo...@sony.com> Date: Mon, 5 Aug 2024 16:21:53 +0100 Subject: [PATCH 1/3] [DebugInfo][RemoveDIs] Use iterator-inserters in clang As part of the LLVM effort to eliminate debug-info intrinsics, we're moving to a world where only iterators should be used to insert instructions. This isn't a problem in clang when instructions get generated before any debug-info is inserted, however we're planning on deprecating and removing the instruction-pointer insertion routines. Scatter some calls to getIterator in a few places, remove a deref-then-addrof on another iterator, and add an overload for the createLoadInstBefore utility. Some callers passes a null insertion point, which we need to handle explicitly now. --- clang/lib/CodeGen/CGCUDANV.cpp | 6 +++--- clang/lib/CodeGen/CGCall.cpp | 4 ++-- clang/lib/CodeGen/CGCleanup.cpp | 20 ++++++++++++++------ clang/lib/CodeGen/CGCoroutine.cpp | 5 +++-- clang/lib/CodeGen/CGExpr.cpp | 2 +- clang/lib/CodeGen/CGObjC.cpp | 3 ++- clang/lib/CodeGen/CGStmt.cpp | 2 +- clang/lib/CodeGen/CodeGenFunction.h | 4 ++-- clang/lib/CodeGen/CodeGenModule.cpp | 10 +++++----- 9 files changed, 33 insertions(+), 23 deletions(-) diff --git a/clang/lib/CodeGen/CGCUDANV.cpp b/clang/lib/CodeGen/CGCUDANV.cpp index 43dfbbb90dd52..1f5fb630a4703 100644 --- a/clang/lib/CodeGen/CGCUDANV.cpp +++ b/clang/lib/CodeGen/CGCUDANV.cpp @@ -505,9 +505,9 @@ static void replaceManagedVar(llvm::GlobalVariable *Var, } if (auto *I = dyn_cast<llvm::Instruction>(U)) { llvm::Value *OldV = Var; - llvm::Instruction *NewV = - new llvm::LoadInst(Var->getType(), ManagedVar, "ld.managed", false, - llvm::Align(Var->getAlignment()), I); + llvm::Instruction *NewV = new llvm::LoadInst( + Var->getType(), ManagedVar, "ld.managed", false, + llvm::Align(Var->getAlignment()), I->getIterator()); WorkItem.pop_back(); // Replace constant expressions directly or indirectly using the managed // variable with instructions. diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 2f3dd5d01fa6c..437aa7bc67dc7 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -5081,8 +5081,8 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, llvm::AllocaInst *AI; if (IP) { IP = IP->getNextNode(); - AI = new llvm::AllocaInst(ArgStruct, DL.getAllocaAddrSpace(), - "argmem", IP); + AI = new llvm::AllocaInst(ArgStruct, DL.getAllocaAddrSpace(), "argmem", + IP->getIterator()); } else { AI = CreateTempAlloca(ArgStruct, "argmem"); } diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp index 4e210a9e3c95f..ba0632de31473 100644 --- a/clang/lib/CodeGen/CGCleanup.cpp +++ b/clang/lib/CodeGen/CGCleanup.cpp @@ -295,18 +295,25 @@ void EHScopeStack::Cleanup::anchor() {} static void createStoreInstBefore(llvm::Value *value, Address addr, llvm::Instruction *beforeInst, CodeGenFunction &CGF) { - auto store = new llvm::StoreInst(value, addr.emitRawPointer(CGF), beforeInst); + auto store = new llvm::StoreInst(value, addr.emitRawPointer(CGF), + beforeInst->getIterator()); store->setAlignment(addr.getAlignment().getAsAlign()); } static llvm::LoadInst *createLoadInstBefore(Address addr, const Twine &name, - llvm::Instruction *beforeInst, + llvm::BasicBlock::iterator beforeInst, CodeGenFunction &CGF) { return new llvm::LoadInst(addr.getElementType(), addr.emitRawPointer(CGF), name, false, addr.getAlignment().getAsAlign(), beforeInst); } +static llvm::LoadInst *createLoadInstBefore(Address addr, const Twine &name, + CodeGenFunction &CGF) { + return new llvm::LoadInst(addr.getElementType(), addr.emitRawPointer(CGF), + name, false, addr.getAlignment().getAsAlign()); +} + /// All the branch fixups on the EH stack have propagated out past the /// outermost normal cleanup; resolve them all by adding cases to the /// given switch instruction. @@ -358,7 +365,7 @@ static llvm::SwitchInst *TransitionToCleanupSwitch(CodeGenFunction &CGF, if (llvm::BranchInst *Br = dyn_cast<llvm::BranchInst>(Term)) { assert(Br->isUnconditional()); auto Load = createLoadInstBefore(CGF.getNormalCleanupDestSlot(), - "cleanup.dest", Term, CGF); + "cleanup.dest", Term->getIterator(), CGF); llvm::SwitchInst *Switch = llvm::SwitchInst::Create(Load, Br->getSuccessor(0), 4, Block); Br->eraseFromParent(); @@ -612,7 +619,8 @@ static void destroyOptimisticNormalEntry(CodeGenFunction &CGF, llvm::SwitchInst *si = cast<llvm::SwitchInst>(use.getUser()); if (si->getNumCases() == 1 && si->getDefaultDest() == unreachableBB) { // Replace the switch with a branch. - llvm::BranchInst::Create(si->case_begin()->getCaseSuccessor(), si); + llvm::BranchInst::Create(si->case_begin()->getCaseSuccessor(), + si->getIterator()); // The switch operand is a load from the cleanup-dest alloca. llvm::LoadInst *condition = cast<llvm::LoadInst>(si->getCondition()); @@ -908,8 +916,8 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough, // pass the abnormal exit flag to Fn (SEH cleanup) cleanupFlags.setHasExitSwitch(); - llvm::LoadInst *Load = createLoadInstBefore( - getNormalCleanupDestSlot(), "cleanup.dest", nullptr, *this); + llvm::LoadInst *Load = createLoadInstBefore(getNormalCleanupDestSlot(), + "cleanup.dest", *this); llvm::SwitchInst *Switch = llvm::SwitchInst::Create(Load, Default, SwitchCapacity); diff --git a/clang/lib/CodeGen/CGCoroutine.cpp b/clang/lib/CodeGen/CGCoroutine.cpp index a8a70186c2c5a..0c09ff96f9d6b 100644 --- a/clang/lib/CodeGen/CGCoroutine.cpp +++ b/clang/lib/CodeGen/CGCoroutine.cpp @@ -866,8 +866,9 @@ void CodeGenFunction::EmitCoroutineBody(const CoroutineBodyStmt &S) { EmitStmt(S.getPromiseDeclStmt()); Address PromiseAddr = GetAddrOfLocalVar(S.getPromiseDecl()); - auto *PromiseAddrVoidPtr = new llvm::BitCastInst( - PromiseAddr.emitRawPointer(*this), VoidPtrTy, "", CoroId); + auto *PromiseAddrVoidPtr = + new llvm::BitCastInst(PromiseAddr.emitRawPointer(*this), VoidPtrTy, "", + CoroId->getIterator()); // Update CoroId to refer to the promise. We could not do it earlier because // promise local variable was not emitted yet. CoroId->setArgOperand(1, PromiseAddrVoidPtr); diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 5f58a64d8386c..7f7ef5e64a0e5 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -121,7 +121,7 @@ llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, Alloca = Builder.CreateAlloca(Ty, ArraySize, Name); else Alloca = new llvm::AllocaInst(Ty, CGM.getDataLayout().getAllocaAddrSpace(), - ArraySize, Name, &*AllocaInsertPt); + ArraySize, Name, AllocaInsertPt); if (Allocas) { Allocas->Add(Alloca); } diff --git a/clang/lib/CodeGen/CGObjC.cpp b/clang/lib/CodeGen/CGObjC.cpp index 80a64d8e4cdd9..a73a71f2d2688 100644 --- a/clang/lib/CodeGen/CGObjC.cpp +++ b/clang/lib/CodeGen/CGObjC.cpp @@ -2393,7 +2393,8 @@ static llvm::Value *emitOptimizedARCReturnCall(llvm::Value *value, llvm::OperandBundleDef OB("clang.arc.attachedcall", bundleArgs); auto *oldCall = cast<llvm::CallBase>(value); llvm::CallBase *newCall = llvm::CallBase::addOperandBundle( - oldCall, llvm::LLVMContext::OB_clang_arc_attachedcall, OB, oldCall); + oldCall, llvm::LLVMContext::OB_clang_arc_attachedcall, OB, + oldCall->getIterator()); newCall->copyMetadata(*oldCall); oldCall->replaceAllUsesWith(newCall); oldCall->eraseFromParent(); diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index e16aa3cdd5506..87cd323bbd78c 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -3226,7 +3226,7 @@ CodeGenFunction::addConvergenceControlToken(llvm::CallBase *Input, llvm::Value *bundleArgs[] = {ParentToken}; llvm::OperandBundleDef OB("convergencectrl", bundleArgs); auto Output = llvm::CallBase::addOperandBundle( - Input, llvm::LLVMContext::OB_convergencectrl, OB, Input); + Input, llvm::LLVMContext::OB_convergencectrl, OB, Input->getIterator()); Input->replaceAllUsesWith(Output); Input->eraseFromParent(); return Output; diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 89cc819c43bb5..2a2b4dd733b74 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -1310,8 +1310,8 @@ class CodeGenFunction : public CodeGenTypeCache { CodeGenFunction &CGF) { assert(isInConditionalBranch()); llvm::BasicBlock *block = OutermostConditional->getStartingBlock(); - auto store = - new llvm::StoreInst(value, addr.emitRawPointer(CGF), &block->back()); + auto store = new llvm::StoreInst(value, addr.emitRawPointer(CGF), + block->back().getIterator()); store->setAlignment(addr.getAlignment().getAsAlign()); } diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 8057812f80311..5e220a47d7ce0 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -5893,13 +5893,13 @@ static void replaceUsesOfNonProtoConstant(llvm::Constant *old, llvm::CallBase *newCall; if (isa<llvm::CallInst>(callSite)) { - newCall = - llvm::CallInst::Create(newFn, newArgs, newBundles, "", callSite); + newCall = llvm::CallInst::Create(newFn, newArgs, newBundles, "", + callSite->getIterator()); } else { auto *oldInvoke = cast<llvm::InvokeInst>(callSite); - newCall = llvm::InvokeInst::Create(newFn, oldInvoke->getNormalDest(), - oldInvoke->getUnwindDest(), newArgs, - newBundles, "", callSite); + newCall = llvm::InvokeInst::Create( + newFn, oldInvoke->getNormalDest(), oldInvoke->getUnwindDest(), + newArgs, newBundles, "", callSite->getIterator()); } newArgs.clear(); // for the next iteration >From f652bb1d835f506a942ae8bc154d22b4da4545ec Mon Sep 17 00:00:00 2001 From: Jeremy Morse <jeremy.mo...@sony.com> Date: Thu, 8 Aug 2024 17:31:57 +0100 Subject: [PATCH 2/3] Implement some review feedback (see reviews), Also fix a stupid build failure where I'd assumed a &* pattern on a variable was dereferencing-addrofing an iterator. It's actually a ValueHandle, so we have to call getIterator directly. --- clang/lib/CodeGen/CGCleanup.cpp | 12 ++++++------ clang/lib/CodeGen/CGExpr.cpp | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp index ba0632de31473..1556aed7acfaf 100644 --- a/clang/lib/CodeGen/CGCleanup.cpp +++ b/clang/lib/CodeGen/CGCleanup.cpp @@ -293,10 +293,10 @@ void CodeGenFunction::initFullExprCleanupWithFlag(RawAddress ActiveFlag) { void EHScopeStack::Cleanup::anchor() {} static void createStoreInstBefore(llvm::Value *value, Address addr, - llvm::Instruction *beforeInst, + llvm::BasicBlock::iterator beforeInst, CodeGenFunction &CGF) { auto store = new llvm::StoreInst(value, addr.emitRawPointer(CGF), - beforeInst->getIterator()); + beforeInst); store->setAlignment(addr.getAlignment().getAsAlign()); } @@ -337,7 +337,7 @@ static void ResolveAllBranchFixups(CodeGenFunction &CGF, // entry which we're currently popping. if (Fixup.OptimisticBranchBlock == nullptr) { createStoreInstBefore(CGF.Builder.getInt32(Fixup.DestinationIndex), - CGF.getNormalCleanupDestSlot(), Fixup.InitialBranch, + CGF.getNormalCleanupDestSlot(), Fixup.InitialBranch->getIterator(), CGF); Fixup.InitialBranch->setSuccessor(0, CleanupEntry); } @@ -965,7 +965,7 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough, if (!Fixup.Destination) continue; if (!Fixup.OptimisticBranchBlock) { createStoreInstBefore(Builder.getInt32(Fixup.DestinationIndex), - getNormalCleanupDestSlot(), Fixup.InitialBranch, + getNormalCleanupDestSlot(), Fixup.InitialBranch->getIterator(), *this); Fixup.InitialBranch->setSuccessor(0, NormalEntry); } @@ -1141,7 +1141,7 @@ void CodeGenFunction::EmitBranchThroughCleanup(JumpDest Dest) { // Store the index at the start. llvm::ConstantInt *Index = Builder.getInt32(Dest.getDestIndex()); - createStoreInstBefore(Index, getNormalCleanupDestSlot(), BI, *this); + createStoreInstBefore(Index, getNormalCleanupDestSlot(), BI->getIterator(), *this); // Adjust BI to point to the first cleanup block. { @@ -1260,7 +1260,7 @@ static void SetupCleanupBlockActivation(CodeGenFunction &CGF, if (CGF.isInConditionalBranch()) { CGF.setBeforeOutermostConditional(value, var, CGF); } else { - createStoreInstBefore(value, var, dominatingIP, CGF); + createStoreInstBefore(value, var, dominatingIP->getIterator(), CGF); } } diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 7f7ef5e64a0e5..bb866a62ebad7 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -121,7 +121,7 @@ llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, Alloca = Builder.CreateAlloca(Ty, ArraySize, Name); else Alloca = new llvm::AllocaInst(Ty, CGM.getDataLayout().getAllocaAddrSpace(), - ArraySize, Name, AllocaInsertPt); + ArraySize, Name, AllocaInsertPt->getIterator()); if (Allocas) { Allocas->Add(Alloca); } >From aa220377ca3c62a65cd16cc83519e44b2a3b3e72 Mon Sep 17 00:00:00 2001 From: Jeremy Morse <jeremy.mo...@sony.com> Date: Thu, 8 Aug 2024 17:48:49 +0100 Subject: [PATCH 3/3] clang-format --- clang/lib/CodeGen/CGCleanup.cpp | 17 +++++++++-------- clang/lib/CodeGen/CGExpr.cpp | 5 +++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp index 1556aed7acfaf..b1af4a0a97884 100644 --- a/clang/lib/CodeGen/CGCleanup.cpp +++ b/clang/lib/CodeGen/CGCleanup.cpp @@ -295,8 +295,7 @@ void EHScopeStack::Cleanup::anchor() {} static void createStoreInstBefore(llvm::Value *value, Address addr, llvm::BasicBlock::iterator beforeInst, CodeGenFunction &CGF) { - auto store = new llvm::StoreInst(value, addr.emitRawPointer(CGF), - beforeInst); + auto store = new llvm::StoreInst(value, addr.emitRawPointer(CGF), beforeInst); store->setAlignment(addr.getAlignment().getAsAlign()); } @@ -337,8 +336,8 @@ static void ResolveAllBranchFixups(CodeGenFunction &CGF, // entry which we're currently popping. if (Fixup.OptimisticBranchBlock == nullptr) { createStoreInstBefore(CGF.Builder.getInt32(Fixup.DestinationIndex), - CGF.getNormalCleanupDestSlot(), Fixup.InitialBranch->getIterator(), - CGF); + CGF.getNormalCleanupDestSlot(), + Fixup.InitialBranch->getIterator(), CGF); Fixup.InitialBranch->setSuccessor(0, CleanupEntry); } @@ -962,11 +961,12 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough, for (unsigned I = FixupDepth, E = EHStack.getNumBranchFixups(); I < E; ++I) { BranchFixup &Fixup = EHStack.getBranchFixup(I); - if (!Fixup.Destination) continue; + if (!Fixup.Destination) + continue; if (!Fixup.OptimisticBranchBlock) { createStoreInstBefore(Builder.getInt32(Fixup.DestinationIndex), - getNormalCleanupDestSlot(), Fixup.InitialBranch->getIterator(), - *this); + getNormalCleanupDestSlot(), + Fixup.InitialBranch->getIterator(), *this); Fixup.InitialBranch->setSuccessor(0, NormalEntry); } Fixup.OptimisticBranchBlock = NormalExit; @@ -1141,7 +1141,8 @@ void CodeGenFunction::EmitBranchThroughCleanup(JumpDest Dest) { // Store the index at the start. llvm::ConstantInt *Index = Builder.getInt32(Dest.getDestIndex()); - createStoreInstBefore(Index, getNormalCleanupDestSlot(), BI->getIterator(), *this); + createStoreInstBefore(Index, getNormalCleanupDestSlot(), BI->getIterator(), + *this); // Adjust BI to point to the first cleanup block. { diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index bb866a62ebad7..5642ce5611e9d 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -120,8 +120,9 @@ llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, if (ArraySize) Alloca = Builder.CreateAlloca(Ty, ArraySize, Name); else - Alloca = new llvm::AllocaInst(Ty, CGM.getDataLayout().getAllocaAddrSpace(), - ArraySize, Name, AllocaInsertPt->getIterator()); + Alloca = + new llvm::AllocaInst(Ty, CGM.getDataLayout().getAllocaAddrSpace(), + ArraySize, Name, AllocaInsertPt->getIterator()); if (Allocas) { Allocas->Add(Alloca); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits