[Mlir-commits] [mlir] [mlir][spirv] Add gpu printf op lowering to spirv.CL.printf op (PR #78510)
Jakub Kuderski
llvmlistbot at llvm.org
Wed Jan 17 21:08:42 PST 2024
================
@@ -607,6 +616,108 @@ class GPUSubgroupReduceConversion final
}
};
+LogicalResult GPUPrintfConversion::matchAndRewrite(
+ gpu::PrintfOp gpuPrintfOp, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const {
+
+ auto loc = gpuPrintfOp.getLoc();
+
+ auto funcOp =
+ rewriter.getBlock()->getParent()->getParentOfType<mlir::spirv::FuncOp>();
+
+ auto moduleOp = funcOp->getParentOfType<mlir::spirv::ModuleOp>();
+
+ const char formatStringPrefix[] = "printfMsg";
+ unsigned stringNumber = 0;
+ mlir::SmallString<16> globalVarName;
+ mlir::spirv::GlobalVariableOp globalVar;
+
+ // formulate spirv global variable name
+ do {
+ globalVarName.clear();
+ (formatStringPrefix + llvm::Twine(stringNumber++))
+ .toStringRef(globalVarName);
+ } while (moduleOp.lookupSymbol(globalVarName));
+
+ auto i8Type = rewriter.getI8Type();
+ auto i32Type = rewriter.getI32Type();
+
+ unsigned scNum = 0;
+ auto createSpecConstant = [&](unsigned value) {
+ auto attr = rewriter.getI8IntegerAttr(value);
+ mlir::SmallString<16> specCstName;
+ (llvm::Twine(globalVarName) + "_sc" + llvm::Twine(scNum++))
+ .toStringRef(specCstName);
+
+ return rewriter.create<mlir::spirv::SpecConstantOp>(
+ loc, rewriter.getStringAttr(specCstName), attr);
+ };
+
+ // define GlobalVarOp with printf format string using SpecConstants
+ // and make composite of SpecConstants
+ {
+ mlir::Operation *parent =
+ mlir::SymbolTable::getNearestSymbolTable(gpuPrintfOp->getParentOp());
+
+ mlir::ConversionPatternRewriter::InsertionGuard guard(rewriter);
----------------
kuhar wrote:
nit: we don't need the mlir namespace prefix
https://github.com/llvm/llvm-project/pull/78510
More information about the Mlir-commits
mailing list