Skip to content

Commit 43e3cec

Browse files
committed
Adjust arguments and locals of declare target function.
1 parent 2d7db74 commit 43e3cec

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
#include "llvm/TargetParser/Triple.h"
3535
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
3636
#include "llvm/Transforms/Utils/ModuleUtils.h"
37+
#include "llvm/IR/InstIterator.h"
38+
#include "llvm/IR/IntrinsicInst.h"
3739

3840
#include <any>
3941
#include <cstdint>
@@ -4592,6 +4594,59 @@ convertDeclareTargetAttr(Operation *op, mlir::omp::DeclareTargetAttr attribute,
45924594
moduleTranslation.lookupFunction(funcOp.getName());
45934595
llvmFunc->dropAllReferences();
45944596
llvmFunc->eraseFromParent();
4597+
} else {
4598+
llvm::Function *llvmFunc =
4599+
moduleTranslation.lookupFunction(funcOp.getName());// abid
4600+
4601+
llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder();
4602+
llvm::IRBuilderBase &builder = ompBuilder->Builder;
4603+
auto curInsert = builder.saveIP();
4604+
llvm::BasicBlock &funcEntryBlock = llvmFunc->getEntryBlock();
4605+
unsigned int allocaAS = ompBuilder->M.getDataLayout().getAllocaAddrSpace();
4606+
unsigned int defaultAS = ompBuilder->M.getDataLayout().getProgramAddressSpace();
4607+
4608+
auto genAlloca = [&](llvm::Value *arg) {
4609+
builder.SetInsertPoint(funcEntryBlock.getFirstInsertionPt());
4610+
llvm::Value *v =
4611+
builder.CreateAlloca(arg->getType(), allocaAS, nullptr);
4612+
if (allocaAS != defaultAS && arg->getType()->isPointerTy())
4613+
v = ompBuilder->Builder.CreateAddrSpaceCast(
4614+
v, builder.getPtrTy(defaultAS));
4615+
4616+
builder.CreateStore(arg, v);
4617+
builder.restoreIP(curInsert);
4618+
return v;
4619+
};
4620+
for (llvm::Instruction &I : instructions(llvmFunc)) {
4621+
if (auto *DDI = dyn_cast<llvm::DbgVariableIntrinsic>(&I)) {
4622+
for (auto Loc : DDI->location_ops()) {
4623+
llvm::DIExprBuilder ExprBuilder(llvmFunc->getContext());
4624+
ExprBuilder.append<llvm::DIOp::Arg>(0u, ompBuilder->Builder.getPtrTy(allocaAS));
4625+
if (llvm::isa<llvm::Argument>(Loc)) {
4626+
ExprBuilder.append<llvm::DIOp::Deref>(
4627+
ompBuilder->Builder.getPtrTy(defaultAS));
4628+
llvm::Value *V = genAlloca(Loc);
4629+
DDI->replaceVariableLocationOp(Loc, V);
4630+
}
4631+
ExprBuilder.append<llvm::DIOp::Deref>(Loc->getType());
4632+
DDI->setExpression(ExprBuilder.intoExpression());
4633+
}
4634+
}
4635+
for (llvm::DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
4636+
for (auto Loc : DVR.location_ops()) {
4637+
llvm::DIExprBuilder ExprBuilder(llvmFunc->getContext());
4638+
ExprBuilder.append<llvm::DIOp::Arg>(0u, ompBuilder->Builder.getPtrTy(allocaAS));
4639+
if (llvm::isa<llvm::Argument>(Loc)) {
4640+
ExprBuilder.append<llvm::DIOp::Deref>(
4641+
ompBuilder->Builder.getPtrTy(defaultAS));
4642+
llvm::Value *V = genAlloca(Loc);
4643+
DVR.replaceVariableLocationOp(Loc, V);
4644+
}
4645+
ExprBuilder.append<llvm::DIOp::Deref>(Loc->getType());
4646+
DVR.setExpression(ExprBuilder.intoExpression());
4647+
}
4648+
}
4649+
}
45954650
}
45964651
}
45974652
return success();

0 commit comments

Comments
 (0)