Author: Bruno Cardoso Lopes Date: 2025-02-26T16:00:26-08:00 New Revision: 7ea3a19cf1cc8944f5fe00dd0dfaf01b2a651846
URL: https://github.com/llvm/llvm-project/commit/7ea3a19cf1cc8944f5fe00dd0dfaf01b2a651846 DIFF: https://github.com/llvm/llvm-project/commit/7ea3a19cf1cc8944f5fe00dd0dfaf01b2a651846.diff LOG: Revert "[MLIR][LLVMIR] Import unregistered intrinsics via llvm.intrinsic_call…" This reverts commit d584d1f188553b6cb417beb903f58d763c265380. Added: Modified: mlir/include/mlir/Target/LLVMIR/LLVMImportInterface.h mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMIRToLLVMTranslation.cpp mlir/test/Target/LLVMIR/Import/import-failure.ll Removed: mlir/test/Target/LLVMIR/Import/intrinsic-unregistered.ll ################################################################################ diff --git a/mlir/include/mlir/Target/LLVMIR/LLVMImportInterface.h b/mlir/include/mlir/Target/LLVMIR/LLVMImportInterface.h index 686969f891f20..cc5a77ed35d2b 100644 --- a/mlir/include/mlir/Target/LLVMIR/LLVMImportInterface.h +++ b/mlir/include/mlir/Target/LLVMIR/LLVMImportInterface.h @@ -155,18 +155,9 @@ class LLVMImportInterface LogicalResult convertIntrinsic(OpBuilder &builder, llvm::CallInst *inst, LLVM::ModuleImport &moduleImport) const { // Lookup the dialect interface for the given intrinsic. - // Verify the intrinsic identifier maps to an actual intrinsic. - llvm::Intrinsic::ID intrinId = inst->getIntrinsicID(); - assert(intrinId != llvm::Intrinsic::not_intrinsic); - - // First lookup the intrinsic across diff erent dialects for known - // supported conversions, examples include arm-neon, nvm-sve, etc. - Dialect *dialect = intrinsicToDialect.lookup(intrinId); - - // No specialized (supported) intrinsics, attempt to generate a generic - // version via llvm.call_intrinsic (if available). + Dialect *dialect = intrinsicToDialect.lookup(inst->getIntrinsicID()); if (!dialect) - return convertUnregisteredIntrinsic(builder, inst, moduleImport); + return failure(); // Dispatch the conversion to the dialect interface. const LLVMImportDialectInterface *iface = getInterfaceFor(dialect); @@ -233,11 +224,6 @@ class LLVMImportInterface } private: - /// Generate llvm.call_intrinsic when no supporting dialect available. - static LogicalResult - convertUnregisteredIntrinsic(OpBuilder &builder, llvm::CallInst *inst, - LLVM::ModuleImport &moduleImport); - DenseMap<unsigned, Dialect *> intrinsicToDialect; DenseMap<unsigned, const LLVMImportDialectInterface *> instructionToDialect; DenseMap<unsigned, SmallVector<Dialect *, 1>> metadataToDialect; diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMIRToLLVMTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMIRToLLVMTranslation.cpp index 227779f355069..4fd043c7c93e6 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMIRToLLVMTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMIRToLLVMTranslation.cpp @@ -367,45 +367,6 @@ static LogicalResult setIntelReqdSubGroupSizeAttr(Builder &builder, return success(); } -LogicalResult mlir::LLVMImportInterface::convertUnregisteredIntrinsic( - OpBuilder &builder, llvm::CallInst *inst, - LLVM::ModuleImport &moduleImport) { - StringRef intrinName = inst->getCalledFunction()->getName(); - - SmallVector<llvm::Value *> args(inst->args()); - ArrayRef<llvm::Value *> llvmOperands(args); - - SmallVector<llvm::OperandBundleUse> llvmOpBundles; - llvmOpBundles.reserve(inst->getNumOperandBundles()); - for (unsigned i = 0; i < inst->getNumOperandBundles(); ++i) - llvmOpBundles.push_back(inst->getOperandBundleAt(i)); - - SmallVector<Value> mlirOperands; - SmallVector<NamedAttribute> mlirAttrs; - if (failed(moduleImport.convertIntrinsicArguments( - llvmOperands, llvmOpBundles, false, {}, {}, mlirOperands, mlirAttrs))) - return failure(); - - Type results = moduleImport.convertType(inst->getType()); - auto op = builder.create<::mlir::LLVM::CallIntrinsicOp>( - moduleImport.translateLoc(inst->getDebugLoc()), results, - StringAttr::get(builder.getContext(), intrinName), - ValueRange{mlirOperands}, FastmathFlagsAttr{}); - - moduleImport.setFastmathFlagsAttr(inst, op); - - // Update importer tracking of results. - unsigned numRes = op.getNumResults(); - if (numRes == 1) - moduleImport.mapValue(inst) = op.getResult(0); - else if (numRes == 0) - moduleImport.mapNoResultOp(inst); - else - return op.emitError( - "expected at most one result from target intrinsic call"); - - return success(); -} namespace { /// Implementation of the dialect interface that converts operations belonging diff --git a/mlir/test/Target/LLVMIR/Import/import-failure.ll b/mlir/test/Target/LLVMIR/Import/import-failure.ll index fc4ccddb756d5..d929a59284762 100644 --- a/mlir/test/Target/LLVMIR/Import/import-failure.ll +++ b/mlir/test/Target/LLVMIR/Import/import-failure.ll @@ -38,6 +38,18 @@ bb1: ; // ----- +declare void @llvm.gcroot(ptr %arg1, ptr %arg2) + +; CHECK: <unknown> +; CHECK-SAME: error: unhandled intrinsic: call void @llvm.gcroot(ptr %arg1, ptr null) +define void @unhandled_intrinsic() gc "example" { + %arg1 = alloca ptr + call void @llvm.gcroot(ptr %arg1, ptr null) + ret void +} + +; // ----- + ; Check that debug intrinsics with an unsupported argument are dropped. declare void @llvm.dbg.value(metadata, metadata, metadata) diff --git a/mlir/test/Target/LLVMIR/Import/intrinsic-unregistered.ll b/mlir/test/Target/LLVMIR/Import/intrinsic-unregistered.ll deleted file mode 100644 index 554be8f797b75..0000000000000 --- a/mlir/test/Target/LLVMIR/Import/intrinsic-unregistered.ll +++ /dev/null @@ -1,68 +0,0 @@ -; RUN: mlir-translate -import-llvm %s -split-input-file | FileCheck %s - -declare i64 @llvm.aarch64.ldxr.p0(ptr) - -define dso_local void @t0(ptr %a) { - %x = call i64 @llvm.aarch64.ldxr.p0(ptr elementtype(i8) %a) - ret void -} - -; CHECK-LABEL: llvm.func @llvm.aarch64.ldxr.p0(!llvm.ptr) -; CHECK-LABEL: llvm.func @t0 -; CHECK: llvm.call_intrinsic "llvm.aarch64.ldxr.p0"({{.*}}) : (!llvm.ptr) -> i64 -; CHECK: llvm.return -; CHECK: } - -; // ----- - -declare <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8>, <8 x i8>) - -define dso_local <8 x i8> @t1(<8 x i8> %lhs, <8 x i8> %rhs) { - %r = call <8 x i8> @llvm.aarch64.neon.uabd.v8i8(<8 x i8> %lhs, <8 x i8> %rhs) - ret <8 x i8> %r -} - -; CHECK: llvm.func @t1(%[[A0:.*]]: vector<8xi8>, %[[A1:.*]]: vector<8xi8>) -> vector<8xi8> {{.*}} { -; CHECK: %[[R:.*]] = llvm.call_intrinsic "llvm.aarch64.neon.uabd.v8i8"(%[[A0]], %[[A1]]) : (vector<8xi8>, vector<8xi8>) -> vector<8xi8> -; CHECK: llvm.return %[[R]] : vector<8xi8> -; CHECK: } - -; // ----- - -declare void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8>, <8 x i8>, ptr) - -define dso_local void @t2(<8 x i8> %lhs, <8 x i8> %rhs, ptr %a) { - call void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8> %lhs, <8 x i8> %rhs, ptr %a) - ret void -} - -; CHECK: llvm.func @t2(%[[A0:.*]]: vector<8xi8>, %[[A1:.*]]: vector<8xi8>, %[[A2:.*]]: !llvm.ptr) {{.*}} { -; CHECK: llvm.call_intrinsic "llvm.aarch64.neon.st2.v8i8.p0"(%[[A0]], %[[A1]], %[[A2]]) : (vector<8xi8>, vector<8xi8>, !llvm.ptr) -> !llvm.void -; CHECK: llvm.return -; CHECK: } - -; // ----- - -declare void @llvm.gcroot(ptr %arg1, ptr %arg2) -define void @gctest() gc "example" { - %arg1 = alloca ptr - call void @llvm.gcroot(ptr %arg1, ptr null) - ret void -} - -; CHECK-LABEL: @gctest -; CHECK: llvm.call_intrinsic "llvm.gcroot"({{.*}}, {{.*}}) : (!llvm.ptr, !llvm.ptr) -> !llvm.void - -; // ----- - -; Test we get the supported version, not the unregistered one. - -declare i32 @llvm.lround.i32.f32(float) - -; CHECK-LABEL: llvm.func @lround_test -define void @lround_test(float %0, double %1) { - ; CHECK-NOT: llvm.call_intrinsic "llvm.lround - ; CHECK: llvm.intr.lround(%{{.*}}) : (f32) -> i32 - %3 = call i32 @llvm.lround.i32.f32(float %0) - ret void -} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits