|
34 | 34 | #include "llvm/TargetParser/Triple.h" |
35 | 35 | #include "llvm/Transforms/Utils/BasicBlockUtils.h" |
36 | 36 | #include "llvm/Transforms/Utils/ModuleUtils.h" |
| 37 | +#include "llvm/IR/InstIterator.h" |
| 38 | +#include "llvm/IR/IntrinsicInst.h" |
37 | 39 |
|
38 | 40 | #include <any> |
39 | 41 | #include <cstdint> |
@@ -4592,6 +4594,59 @@ convertDeclareTargetAttr(Operation *op, mlir::omp::DeclareTargetAttr attribute, |
4592 | 4594 | moduleTranslation.lookupFunction(funcOp.getName()); |
4593 | 4595 | llvmFunc->dropAllReferences(); |
4594 | 4596 | 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 | + } |
4595 | 4650 | } |
4596 | 4651 | } |
4597 | 4652 | return success(); |
|
0 commit comments