CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
91 lines
3.5 KiB
C++
91 lines
3.5 KiB
C++
//===------------------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements methods from LLVMImportInterface.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Target/LLVMIR/LLVMImportInterface.h"
|
|
#include "mlir/Target/LLVMIR/ModuleImport.h"
|
|
|
|
using namespace mlir;
|
|
using namespace mlir::LLVM;
|
|
using namespace mlir::LLVM::detail;
|
|
|
|
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, /*requiresOpBundles=*/false,
|
|
/*immArgPositions=*/{}, /*immArgAttrNames=*/{}, mlirOperands,
|
|
mlirAttrs)))
|
|
return failure();
|
|
|
|
Type resultType = moduleImport.convertType(inst->getType());
|
|
auto op = CallIntrinsicOp::create(
|
|
builder, moduleImport.translateLoc(inst->getDebugLoc()),
|
|
isa<LLVMVoidType>(resultType) ? TypeRange{} : TypeRange{resultType},
|
|
StringAttr::get(builder.getContext(), intrinName),
|
|
ValueRange{mlirOperands}, FastmathFlagsAttr{});
|
|
|
|
moduleImport.setFastmathFlagsAttr(inst, op);
|
|
moduleImport.convertArgAndResultAttrs(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();
|
|
}
|
|
|
|
/// Converts the LLVM intrinsic to an MLIR operation if a conversion exists.
|
|
/// Returns failure otherwise.
|
|
LogicalResult mlir::LLVMImportInterface::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 different dialects for known
|
|
// supported conversions, examples include arm-neon, nvm-sve, etc.
|
|
Dialect *dialect = nullptr;
|
|
|
|
if (!moduleImport.useUnregisteredIntrinsicsOnly())
|
|
dialect = intrinsicToDialect.lookup(intrinId);
|
|
|
|
// No specialized (supported) intrinsics, attempt to generate a generic
|
|
// version via llvm.call_intrinsic (if available).
|
|
if (!dialect)
|
|
return convertUnregisteredIntrinsic(builder, inst, moduleImport);
|
|
|
|
// Dispatch the conversion to the dialect interface.
|
|
const LLVMImportDialectInterface *iface = getInterfaceFor(dialect);
|
|
assert(iface && "expected to find a dialect interface");
|
|
return iface->convertIntrinsic(builder, inst, moduleImport);
|
|
}
|