Skip to content

Commit

Permalink
[DebugInfo][RemoveDIs] Use iterator-inserters in clang (#102006)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jmorse authored Aug 9, 2024
1 parent cdadc2e commit 92aec51
Show file tree
Hide file tree
Showing 9 changed files with 43 additions and 31 deletions.
6 changes: 3 additions & 3 deletions clang/lib/CodeGen/CGCUDANV.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/CodeGen/CGCall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5064,8 +5064,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");
}
Expand Down
35 changes: 22 additions & 13 deletions clang/lib/CodeGen/CGCleanup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,20 +293,26 @@ 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);
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.
Expand All @@ -330,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,
CGF);
CGF.getNormalCleanupDestSlot(),
Fixup.InitialBranch->getIterator(), CGF);
Fixup.InitialBranch->setSuccessor(0, CleanupEntry);
}

Expand All @@ -358,7 +364,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();
Expand Down Expand Up @@ -612,7 +618,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());
Expand Down Expand Up @@ -908,8 +915,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);

Expand Down Expand Up @@ -954,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,
*this);
getNormalCleanupDestSlot(),
Fixup.InitialBranch->getIterator(), *this);
Fixup.InitialBranch->setSuccessor(0, NormalEntry);
}
Fixup.OptimisticBranchBlock = NormalExit;
Expand Down Expand Up @@ -1133,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, *this);
createStoreInstBefore(Index, getNormalCleanupDestSlot(), BI->getIterator(),
*this);

// Adjust BI to point to the first cleanup block.
{
Expand Down Expand Up @@ -1252,7 +1261,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);
}
}

Expand Down
5 changes: 3 additions & 2 deletions clang/lib/CodeGen/CGCoroutine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 3 additions & 2 deletions clang/lib/CodeGen/CGExpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Alloca =
new llvm::AllocaInst(Ty, CGM.getDataLayout().getAllocaAddrSpace(),
ArraySize, Name, AllocaInsertPt->getIterator());
if (Allocas) {
Allocas->Add(Alloca);
}
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/CodeGen/CGObjC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CGStmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3238,7 +3238,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;
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/CodeGen/CodeGenFunction.h
Original file line number Diff line number Diff line change
Expand Up @@ -1313,8 +1313,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());
}

Expand Down
10 changes: 5 additions & 5 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5911,13 +5911,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

Expand Down

0 comments on commit 92aec51

Please sign in to comment.