MLIR 24.0.0git
SPIRVAttachTarget.cpp
Go to the documentation of this file.
1//===- SPIRVAttachTarget.cpp - Attach an SPIR-V target --------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the `GPUSPIRVAttachTarget` pass, attaching
10// `#spirv.target_env` attributes to GPU modules.
11//
12//===----------------------------------------------------------------------===//
13
15
20#include "mlir/IR/Builders.h"
21#include "mlir/Pass/Pass.h"
22#include "llvm/Support/Regex.h"
23
24namespace mlir {
25#define GEN_PASS_DEF_GPUSPIRVATTACHTARGET
26#include "mlir/Dialect/GPU/Transforms/SPIRV/Passes.h.inc"
27} // namespace mlir
28
29using namespace mlir;
30using namespace mlir::spirv;
31
32namespace {
33struct SPIRVAttachTarget
34 : public impl::GpuSPIRVAttachTargetBase<SPIRVAttachTarget> {
35 using Base::Base;
36
37 void runOnOperation() override;
38
39 void getDependentDialects(DialectRegistry &registry) const override {
40 registry.insert<spirv::SPIRVDialect>();
41 }
42};
43} // namespace
45void SPIRVAttachTarget::runOnOperation() {
46 OpBuilder builder(&getContext());
47 auto versionSymbol = symbolizeVersion(spirvVersion);
48 if (!versionSymbol)
50 auto apiSymbol = symbolizeClientAPI(clientApi);
51 if (!apiSymbol)
53 auto vendorSymbol = symbolizeVendor(deviceVendor);
54 if (!vendorSymbol)
56 auto deviceTypeSymbol = symbolizeDeviceType(deviceType);
57 if (!deviceTypeSymbol)
58 return signalPassFailure();
59 // Set the default device ID if none was given
63 Version version = versionSymbol.value();
64 SmallVector<Capability, 4> capabilities;
66 for (const auto &cap : spirvCapabilities) {
67 auto capSymbol = symbolizeCapability(cap);
68 if (capSymbol)
69 capabilities.push_back(capSymbol.value());
70 }
71 ArrayRef<Capability> caps(capabilities);
72 for (const auto &ext : spirvExtensions) {
73 auto extSymbol = symbolizeExtension(ext);
74 if (extSymbol)
75 extensions.push_back(extSymbol.value());
76 }
77 ArrayRef<Extension> exts(extensions);
78 VerCapExtAttr vce = VerCapExtAttr::get(version, caps, exts, &getContext());
80 apiSymbol.value(), vendorSymbol.value(),
81 deviceTypeSymbol.value(), deviceId);
82 llvm::Regex matcher(moduleMatcher);
83 getOperation()->walk([&](gpu::GPUModuleOp gpuModule) {
84 // Check if the name of the module matches.
85 if (!moduleMatcher.empty() && !matcher.match(gpuModule.getName()))
86 return;
87 // Create the target array.
89 if (std::optional<ArrayAttr> attrs = gpuModule.getTargets())
90 targets.append(attrs->getValue().begin(), attrs->getValue().end());
91 targets.push_back(target);
92 // Remove any duplicate targets.
93 targets.erase(llvm::unique(targets), targets.end());
94 // Update the target attribute array.
95 gpuModule.setTargetsAttr(builder.getArrayAttr(targets));
96 });
b getContext())
This class helps build Operations.
Definition Builders.h:210
void signalPassFailure()
Signal that some invariant was broken when running.
Definition Pass.h:226
::mlir::Pass::Option< std::string > clientApi
::mlir::Pass::ListOption< std::string > spirvCapabilities
::mlir::Pass::Option< std::string > deviceType
::mlir::Pass::Option< std::string > spirvVersion
::mlir::Pass::Option< uint32_t > deviceId
::mlir::Pass::Option< std::string > deviceVendor
::mlir::Pass::Option< std::string > moduleMatcher
::mlir::Pass::ListOption< std::string > spirvExtensions
static constexpr uint32_t kUnknownDeviceID
ID for unknown devices.
static TargetEnvAttr get(VerCapExtAttr triple, ResourceLimitsAttr limits, ClientAPI clientAPI=ClientAPI::Unknown, Vendor vendorID=Vendor::Unknown, DeviceType deviceType=DeviceType::Unknown, uint32_t deviceId=kUnknownDeviceID)
Gets a TargetEnvAttr instance.
An attribute that specifies the SPIR-V (version, capabilities, extensions) triple.
static VerCapExtAttr get(Version version, ArrayRef< Capability > capabilities, ArrayRef< Extension > extensions, MLIRContext *context)
Gets a VerCapExtAttr instance.
ResourceLimitsAttr getDefaultResourceLimits(MLIRContext *context)
Returns a default resource limits attribute that uses numbers from "Table 46. Required Limits" of the...
Include the generated interface declarations.