llvm-project/mlir/test/lib/Dialect/SPIRV/TestEntryPointAbi.cpp
River Riddle 6edef13569 [mlir:PassOption] Rework ListOption parsing and add support for std::vector/SmallVector options
ListOption currently uses llvm:🆑:list under the hood, but the usages
of ListOption are generally a tad different from llvm:🆑:list. This
commit codifies this by making ListOption implicitly comma separated,
and removes the explicit flag set for all of the current list options.
The new parsing for comma separation of ListOption also adds in support
for skipping over delimited sub-ranges (i.e. {}, [], (), "", ''). This
more easily supports nested options that use those as part of the
format, and this constraint (balanced delimiters) is already codified
in the syntax of pass pipelines.

See https://discourse.llvm.org/t/list-of-lists-pass-option/5950 for
related discussion

Differential Revision: https://reviews.llvm.org/D122879
2022-04-02 00:45:11 -07:00

68 lines
2.5 KiB
C++

//===- TestAvailability.cpp - Test pass for setting Entry point ABI info --===//
//
// 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 a pass that sets the spv.entry_point_abi attribute on
// functions that are to be lowered as entry point functions.
//
//===----------------------------------------------------------------------===//
#include "mlir/Dialect/GPU/GPUDialect.h"
#include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h"
#include "mlir/Dialect/SPIRV/IR/TargetAndABI.h"
#include "mlir/Pass/Pass.h"
using namespace mlir;
namespace {
/// Pass to set the spv.entry_point_abi
class TestSpirvEntryPointABIPass
: public PassWrapper<TestSpirvEntryPointABIPass,
OperationPass<gpu::GPUModuleOp>> {
public:
StringRef getArgument() const final { return "test-spirv-entry-point-abi"; }
StringRef getDescription() const final {
return "Set the spv.entry_point_abi attribute on GPU kernel function "
"within the "
"module, intended for testing only";
}
TestSpirvEntryPointABIPass() = default;
TestSpirvEntryPointABIPass(const TestSpirvEntryPointABIPass &) {}
void runOnOperation() override;
private:
Pass::ListOption<int32_t> workgroupSize{
*this, "workgroup-size",
llvm::cl::desc(
"Workgroup size to use for all gpu.func kernels in the module, "
"specified with x-dimension first, y-dimension next and z-dimension "
"last. Unspecified dimensions will be set to 1"),
llvm::cl::ZeroOrMore};
};
} // namespace
void TestSpirvEntryPointABIPass::runOnOperation() {
gpu::GPUModuleOp gpuModule = getOperation();
MLIRContext *context = &getContext();
StringRef attrName = spirv::getEntryPointABIAttrName();
for (gpu::GPUFuncOp gpuFunc : gpuModule.getOps<gpu::GPUFuncOp>()) {
if (!gpu::GPUDialect::isKernel(gpuFunc) || gpuFunc->getAttr(attrName))
continue;
SmallVector<int32_t, 3> workgroupSizeVec(workgroupSize.begin(),
workgroupSize.end());
workgroupSizeVec.resize(3, 1);
gpuFunc->setAttr(attrName,
spirv::getEntryPointABIAttr(workgroupSizeVec, context));
}
}
namespace mlir {
void registerTestSpirvEntryPointABIPass() {
PassRegistration<TestSpirvEntryPointABIPass>();
}
} // namespace mlir