diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp --- a/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULowerModuleLDSPass.cpp @@ -270,8 +270,7 @@ LocalVar->removeDeadConstantUsers(); } - static void markUsedByKernel(IRBuilder<> &Builder, Function *Func, - GlobalVariable *SGV) { + static void markUsedByKernel(Function *Func, GlobalVariable *SGV) { // The llvm.amdgcn.module.lds instance is implicitly used by all kernels // that might call a function which accesses a field within it. This is // presently approximated to 'all kernels' if there are any such functions @@ -292,22 +291,16 @@ // equivalent target specific intrinsic which lasts until immediately after // codegen would suffice for that, but one would still need to ensure that // the variables are allocated in the anticpated order. - - LLVMContext &Ctx = Func->getContext(); - - Builder.SetInsertPoint(Func->getEntryBlock().getFirstNonPHI()); - - FunctionType *FTy = FunctionType::get(Type::getVoidTy(Ctx), {}); + IRBuilder<> Builder(Func->getEntryBlock().getFirstNonPHI()); Function *Decl = Intrinsic::getDeclaration(Func->getParent(), Intrinsic::donothing, {}); - Value *UseInstance[1] = {Builder.CreateInBoundsGEP( - SGV->getValueType(), SGV, ConstantInt::get(Type::getInt32Ty(Ctx), 0))}; + Value *UseInstance[1] = { + Builder.CreateConstInBoundsGEP1_32(SGV->getValueType(), SGV, 0)}; - Builder.CreateCall(FTy, Decl, {}, - {OperandBundleDefT("ExplicitUse", UseInstance)}, - ""); + Builder.CreateCall( + Decl, {}, {OperandBundleDefT("ExplicitUse", UseInstance)}); } static bool eliminateConstantExprUsesOfLDSFromAllInstructions(Module &M) { @@ -884,8 +877,6 @@ // allocate the module scope variable, otherwise leave them unchanged // Record on each kernel whether the module scope global is used by it - IRBuilder<> Builder(Ctx); - for (Function &Func : M.functions()) { if (Func.isDeclaration() || !isKernelLDS(&Func)) continue; @@ -901,7 +892,7 @@ return F == &Func; }); - markUsedByKernel(Builder, &Func, ModuleScopeReplacement.SGV); + markUsedByKernel(&Func, ModuleScopeReplacement.SGV); } } @@ -917,7 +908,6 @@ // Create a struct for each kernel for the non-module-scope variables. - IRBuilder<> Builder(M.getContext()); DenseMap KernelToReplacement; for (Function &Func : M.functions()) { if (Func.isDeclaration() || !isKernelLDS(&Func)) @@ -976,7 +966,7 @@ auto Accesses = LDSUsesInfo.indirect_access.find(&Func); if ((Accesses != LDSUsesInfo.indirect_access.end()) && !Accesses->second.empty()) - markUsedByKernel(Builder, &Func, Replacement.SGV); + markUsedByKernel(&Func, Replacement.SGV); // remove preserves existing codegen removeLocalVarsFromUsedLists(M, KernelUsedVariables); @@ -1065,7 +1055,7 @@ KernelToCreatedDynamicLDS[func] = N; - markUsedByKernel(Builder, func, N); + markUsedByKernel(func, N); auto emptyCharArray = ArrayType::get(Type::getInt8Ty(Ctx), 0); auto GEP = ConstantExpr::getGetElementPtr(