1 //===- TestAvailability.cpp - Test pass for setting Entry point ABI info --===// 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 a pass that sets the spv.entry_point_abi attribute on 10 // functions that are to be lowered as entry point functions. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "mlir/Dialect/GPU/GPUDialect.h" 15 #include "mlir/Dialect/SPIRV/SPIRVDialect.h" 16 #include "mlir/Dialect/SPIRV/TargetAndABI.h" 17 #include "mlir/Pass/Pass.h" 18 19 using namespace mlir; 20 21 namespace { 22 /// Pass to set the spv.entry_point_abi 23 class TestSpirvEntryPointABIPass 24 : public PassWrapper<TestSpirvEntryPointABIPass, 25 OperationPass<gpu::GPUModuleOp>> { 26 public: 27 TestSpirvEntryPointABIPass() = default; 28 TestSpirvEntryPointABIPass(const TestSpirvEntryPointABIPass &) {} 29 void runOnOperation() override; 30 31 private: 32 Pass::ListOption<int32_t> workgroupSize{ 33 *this, "workgroup-size", 34 llvm::cl::desc( 35 "Workgroup size to use for all gpu.func kernels in the module, " 36 "specified with x-dimension first, y-dimension next and z-dimension " 37 "last. Unspecified dimensions will be set to 1"), 38 llvm::cl::ZeroOrMore, llvm::cl::MiscFlags::CommaSeparated}; 39 }; 40 } // namespace 41 42 void TestSpirvEntryPointABIPass::runOnOperation() { 43 gpu::GPUModuleOp gpuModule = getOperation(); 44 MLIRContext *context = &getContext(); 45 StringRef attrName = spirv::getEntryPointABIAttrName(); 46 for (gpu::GPUFuncOp gpuFunc : gpuModule.getOps<gpu::GPUFuncOp>()) { 47 if (!gpu::GPUDialect::isKernel(gpuFunc) || gpuFunc.getAttr(attrName)) 48 continue; 49 SmallVector<int32_t, 3> workgroupSizeVec(workgroupSize.begin(), 50 workgroupSize.end()); 51 workgroupSizeVec.resize(3, 1); 52 gpuFunc.setAttr(attrName, 53 spirv::getEntryPointABIAttr(workgroupSizeVec, context)); 54 } 55 } 56 57 namespace mlir { 58 void registerTestSpirvEntryPointABIPass() { 59 PassRegistration<TestSpirvEntryPointABIPass> registration( 60 "test-spirv-entry-point-abi", 61 "Set the spv.entry_point_abi attribute on GPU kernel function within the " 62 "module, intended for testing only"); 63 } 64 } // namespace mlir 65