diff options
author | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:31:57 +0900 |
---|---|---|
committer | NAKAMURA Takumi <geek4civic@gmail.com> | 2025-01-09 18:33:27 +0900 |
commit | df025ebf872052c0761d44a3ef9b65e9675af8a8 (patch) | |
tree | 9b4e94583e2536546d6606270bcdf846c95e1ba2 /mlir/lib/Target/LLVMIR/ModuleImport.cpp | |
parent | 4428c9d0b1344179f85a72e183a44796976521e3 (diff) | |
parent | bdcf47e4bcb92889665825654bb80a8bbe30379e (diff) | |
download | llvm-users/chapuni/cov/single/loop.zip llvm-users/chapuni/cov/single/loop.tar.gz llvm-users/chapuni/cov/single/loop.tar.bz2 |
Merge branch 'users/chapuni/cov/single/base' into users/chapuni/cov/single/loopusers/chapuni/cov/single/loop
Conflicts:
clang/lib/CodeGen/CoverageMappingGen.cpp
Diffstat (limited to 'mlir/lib/Target/LLVMIR/ModuleImport.cpp')
-rw-r--r-- | mlir/lib/Target/LLVMIR/ModuleImport.cpp | 137 |
1 files changed, 85 insertions, 52 deletions
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp index b0d5e63..2d8d774 100644 --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -427,19 +427,33 @@ ModuleImport::processAliasScopeMetadata(const llvm::MDNode *node) { return node->getNumOperands() != 0 && node == dyn_cast<llvm::MDNode>(node->getOperand(0)); }; + auto verifySelfRefOrString = [](const llvm::MDNode *node) { + return node->getNumOperands() != 0 && + (node == dyn_cast<llvm::MDNode>(node->getOperand(0)) || + isa<llvm::MDString>(node->getOperand(0))); + }; // Helper that verifies the given operand is a string or does not exist. auto verifyDescription = [](const llvm::MDNode *node, unsigned idx) { return idx >= node->getNumOperands() || isa<llvm::MDString>(node->getOperand(idx)); }; + + auto getIdAttr = [&](const llvm::MDNode *node) -> Attribute { + if (verifySelfRef(node)) + return DistinctAttr::create(builder.getUnitAttr()); + + auto name = cast<llvm::MDString>(node->getOperand(0)); + return builder.getStringAttr(name->getString()); + }; + // Helper that creates an alias scope domain attribute. auto createAliasScopeDomainOp = [&](const llvm::MDNode *aliasDomain) { StringAttr description = nullptr; if (aliasDomain->getNumOperands() >= 2) if (auto *operand = dyn_cast<llvm::MDString>(aliasDomain->getOperand(1))) description = builder.getStringAttr(operand->getString()); - return builder.getAttr<AliasScopeDomainAttr>( - DistinctAttr::create(builder.getUnitAttr()), description); + Attribute idAttr = getIdAttr(aliasDomain); + return builder.getAttr<AliasScopeDomainAttr>(idAttr, description); }; // Collect the alias scopes and domains to translate them. @@ -452,10 +466,11 @@ ModuleImport::processAliasScopeMetadata(const llvm::MDNode *node) { // verifying its domain. Perform the verification before looking it up in // the alias scope mapping since it could have been inserted as a domain // node before. - if (!verifySelfRef(scope) || !domain || !verifyDescription(scope, 2)) + if (!verifySelfRefOrString(scope) || !domain || + !verifyDescription(scope, 2)) return emitError(loc) << "unsupported alias scope node: " << diagMD(scope, llvmModule.get()); - if (!verifySelfRef(domain) || !verifyDescription(domain, 1)) + if (!verifySelfRefOrString(domain) || !verifyDescription(domain, 1)) return emitError(loc) << "unsupported alias domain node: " << diagMD(domain, llvmModule.get()); @@ -473,9 +488,10 @@ ModuleImport::processAliasScopeMetadata(const llvm::MDNode *node) { StringAttr description = nullptr; if (!aliasScope.getName().empty()) description = builder.getStringAttr(aliasScope.getName()); + Attribute idAttr = getIdAttr(scope); auto aliasScopeOp = builder.getAttr<AliasScopeAttr>( - DistinctAttr::create(builder.getUnitAttr()), - cast<AliasScopeDomainAttr>(it->second), description); + idAttr, cast<AliasScopeDomainAttr>(it->second), description); + aliasScopeMapping.try_emplace(aliasScope.getNode(), aliasScopeOp); } } @@ -1473,18 +1489,20 @@ ModuleImport::convertBranchArgs(llvm::Instruction *branch, return success(); } -LogicalResult -ModuleImport::convertCallTypeAndOperands(llvm::CallBase *callInst, - SmallVectorImpl<Type> &types, - SmallVectorImpl<Value> &operands) { +LogicalResult ModuleImport::convertCallTypeAndOperands( + llvm::CallBase *callInst, SmallVectorImpl<Type> &types, + SmallVectorImpl<Value> &operands, bool allowInlineAsm) { if (!callInst->getType()->isVoidTy()) types.push_back(convertType(callInst->getType())); if (!callInst->getCalledFunction()) { - FailureOr<Value> called = convertValue(callInst->getCalledOperand()); - if (failed(called)) - return failure(); - operands.push_back(*called); + if (!allowInlineAsm || + !isa<llvm::InlineAsm>(callInst->getCalledOperand())) { + FailureOr<Value> called = convertValue(callInst->getCalledOperand()); + if (failed(called)) + return failure(); + operands.push_back(*called); + } } SmallVector<llvm::Value *> args(callInst->args()); FailureOr<SmallVector<Value>> arguments = convertValues(args); @@ -1579,7 +1597,8 @@ LogicalResult ModuleImport::convertInstruction(llvm::Instruction *inst) { SmallVector<Type> types; SmallVector<Value> operands; - if (failed(convertCallTypeAndOperands(callInst, types, operands))) + if (failed(convertCallTypeAndOperands(callInst, types, operands, + /*allowInlineAsm=*/true))) return failure(); auto funcTy = @@ -1587,45 +1606,59 @@ LogicalResult ModuleImport::convertInstruction(llvm::Instruction *inst) { if (!funcTy) return failure(); - CallOp callOp; - - if (llvm::Function *callee = callInst->getCalledFunction()) { - callOp = builder.create<CallOp>( - loc, funcTy, SymbolRefAttr::get(context, callee->getName()), - operands); + if (auto asmI = dyn_cast<llvm::InlineAsm>(callInst->getCalledOperand())) { + auto callOp = builder.create<InlineAsmOp>( + loc, funcTy.getReturnType(), operands, + builder.getStringAttr(asmI->getAsmString()), + builder.getStringAttr(asmI->getConstraintString()), + /*has_side_effects=*/true, + /*is_align_stack=*/false, /*asm_dialect=*/nullptr, + /*operand_attrs=*/nullptr); + if (!callInst->getType()->isVoidTy()) + mapValue(inst, callOp.getResult(0)); + else + mapNoResultOp(inst, callOp); } else { - callOp = builder.create<CallOp>(loc, funcTy, operands); + CallOp callOp; + + if (llvm::Function *callee = callInst->getCalledFunction()) { + callOp = builder.create<CallOp>( + loc, funcTy, SymbolRefAttr::get(context, callee->getName()), + operands); + } else { + callOp = builder.create<CallOp>(loc, funcTy, operands); + } + callOp.setCConv(convertCConvFromLLVM(callInst->getCallingConv())); + callOp.setTailCallKind( + convertTailCallKindFromLLVM(callInst->getTailCallKind())); + setFastmathFlagsAttr(inst, callOp); + + // Handle function attributes. + if (callInst->hasFnAttr(llvm::Attribute::Convergent)) + callOp.setConvergent(true); + if (callInst->hasFnAttr(llvm::Attribute::NoUnwind)) + callOp.setNoUnwind(true); + if (callInst->hasFnAttr(llvm::Attribute::WillReturn)) + callOp.setWillReturn(true); + + llvm::MemoryEffects memEffects = callInst->getMemoryEffects(); + ModRefInfo othermem = convertModRefInfoFromLLVM( + memEffects.getModRef(llvm::MemoryEffects::Location::Other)); + ModRefInfo argMem = convertModRefInfoFromLLVM( + memEffects.getModRef(llvm::MemoryEffects::Location::ArgMem)); + ModRefInfo inaccessibleMem = convertModRefInfoFromLLVM( + memEffects.getModRef(llvm::MemoryEffects::Location::InaccessibleMem)); + auto memAttr = MemoryEffectsAttr::get(callOp.getContext(), othermem, + argMem, inaccessibleMem); + // Only set the attribute when it does not match the default value. + if (!memAttr.isReadWrite()) + callOp.setMemoryEffectsAttr(memAttr); + + if (!callInst->getType()->isVoidTy()) + mapValue(inst, callOp.getResult()); + else + mapNoResultOp(inst, callOp); } - callOp.setCConv(convertCConvFromLLVM(callInst->getCallingConv())); - callOp.setTailCallKind( - convertTailCallKindFromLLVM(callInst->getTailCallKind())); - setFastmathFlagsAttr(inst, callOp); - - // Handle function attributes. - if (callInst->hasFnAttr(llvm::Attribute::Convergent)) - callOp.setConvergent(true); - if (callInst->hasFnAttr(llvm::Attribute::NoUnwind)) - callOp.setNoUnwind(true); - if (callInst->hasFnAttr(llvm::Attribute::WillReturn)) - callOp.setWillReturn(true); - - llvm::MemoryEffects memEffects = callInst->getMemoryEffects(); - ModRefInfo othermem = convertModRefInfoFromLLVM( - memEffects.getModRef(llvm::MemoryEffects::Location::Other)); - ModRefInfo argMem = convertModRefInfoFromLLVM( - memEffects.getModRef(llvm::MemoryEffects::Location::ArgMem)); - ModRefInfo inaccessibleMem = convertModRefInfoFromLLVM( - memEffects.getModRef(llvm::MemoryEffects::Location::InaccessibleMem)); - auto memAttr = MemoryEffectsAttr::get(callOp.getContext(), othermem, argMem, - inaccessibleMem); - // Only set the attribute when it does not match the default value. - if (!memAttr.isReadWrite()) - callOp.setMemoryEffectsAttr(memAttr); - - if (!callInst->getType()->isVoidTy()) - mapValue(inst, callOp.getResult()); - else - mapNoResultOp(inst, callOp); return success(); } if (inst->getOpcode() == llvm::Instruction::LandingPad) { |