[Mlir-commits] [mlir] [mlir][tosa][spirv] Add TOSA to SPIR-V TOSA pass plumbing (PR #196539)
Igor Wodiany
llvmlistbot at llvm.org
Wed May 20 02:47:19 PDT 2026
================
@@ -0,0 +1,211 @@
+//===- TosaToSPIRVTosaPass.cpp - Lower TOSA to SPIR-V Graph/TOSA ----------===//
+//
+// 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 pass lowers TOSA IR to the SPIR-V Graph/TOSA representation.
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Conversion/TosaToSPIRVTosa/TosaToSPIRVTosa.h"
+
+#include "mlir/Dialect/Func/IR/FuncOps.h"
+#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h"
+#include "mlir/Dialect/SPIRV/IR/TargetAndABI.h"
+#include "mlir/Dialect/SPIRV/Transforms/SPIRVConversion.h"
+#include "mlir/Dialect/Tosa/IR/TosaOps.h"
+#include "mlir/IR/TypeUtilities.h"
+#include "mlir/Transforms/DialectConversion.h"
+
+#include <algorithm>
+
+namespace mlir {
+#define GEN_PASS_DEF_TOSATOSPIRVTOSA
+#include "mlir/Conversion/Passes.h.inc"
+
+namespace tosa {
+
+spirv::VerCapExtAttr getDefaultVerCapExtAttr(MLIRContext *context) {
+ return spirv::VerCapExtAttr::get(
+ spirv::Version::V_1_5,
+ {
+ spirv::Capability::VulkanMemoryModel,
+ spirv::Capability::Shader,
+ spirv::Capability::Int8,
+ spirv::Capability::Int16,
+ spirv::Capability::Int64,
+ spirv::Capability::Float16,
+ spirv::Capability::BFloat16TypeKHR,
+ spirv::Capability::Float8EXT,
+ spirv::Capability::TensorsARM,
+ spirv::Capability::GraphARM,
+ spirv::Capability::ReplicatedCompositesEXT,
+ },
+ {
+ spirv::Extension::SPV_ARM_tensors,
+ spirv::Extension::SPV_ARM_graph,
+ spirv::Extension::SPV_KHR_vulkan_memory_model,
+ spirv::Extension::SPV_EXT_replicated_composites,
+ spirv::Extension::SPV_KHR_bfloat16,
+ spirv::Extension::SPV_EXT_float8,
+ },
+ context);
+}
+
+spirv::TargetEnvAttr constructTargetEnvAttrWithCapExtDefaults(
+ MLIRContext *context, spirv::ResourceLimitsAttr limits,
+ spirv::ClientAPI clientAPI, spirv::Vendor vendorID,
+ spirv::DeviceType deviceType, uint32_t deviceID) {
+ if (!limits)
+ limits = spirv::getDefaultResourceLimits(context);
+
+ return spirv::TargetEnvAttr::get(getDefaultVerCapExtAttr(context), limits,
+ clientAPI, vendorID, deviceType, deviceID);
+}
+
+namespace {
+
+LogicalResult verifyGraphTargetEnv(Operation *op,
+ spirv::TargetEnvAttr targetAttr) {
+ spirv::TargetEnv targetEnv(targetAttr);
+ if (targetEnv.allows(spirv::Capability::GraphARM) &&
+ targetEnv.allows(spirv::Extension::SPV_ARM_graph) &&
+ targetEnv.allows(spirv::Extension::SPV_ARM_tensors)) {
+ return success();
+ }
+
+ return op->emitOpError()
+ << "requires GraphARM capability and SPV_ARM_graph/SPV_ARM_tensors "
+ "extensions in spirv.target_env";
+}
+
+LogicalResult verifyNoFuncCalls(Operation *op) {
+ auto result =
+ op->walk([](Operation *op) -> WalkResult {
+ if (isa<func::CallOp, func::CallIndirectOp>(op)) {
+ op->emitOpError()
+ << "is not supported in TOSA to SPIR-V Graph conversion; inline "
+ "calls before running this pass";
+ return WalkResult::interrupt();
+ }
+ return WalkResult::advance();
+ });
+
+ return failure(result.wasInterrupted());
+}
+
+struct TosaToSPIRVTosa final : impl::TosaToSPIRVTosaBase<TosaToSPIRVTosa> {
+ void runOnOperation() override {
+ MLIRContext *context = &getContext();
+ RewritePatternSet patterns(context);
+ Operation *op = getOperation();
+
+ auto targetAttr = spirv::lookupTargetEnv(op);
----------------
IgWod wrote:
nit: please spell out the type
https://github.com/llvm/llvm-project/pull/196539
More information about the Mlir-commits
mailing list