//===- GPUOpsLowering.h - GPU FuncOp / ReturnOp lowering -------*- C++ -*--===// // // 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 // //===----------------------------------------------------------------------===// #ifndef MLIR_CONVERSION_GPUCOMMON_GPUOPSLOWERING_H_ #define MLIR_CONVERSION_GPUCOMMON_GPUOPSLOWERING_H_ #include "mlir/Conversion/LLVMCommon/Pattern.h" #include "mlir/Dialect/GPU/IR/GPUDialect.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" namespace mlir { /// Lowering for gpu.dynamic.shared.memory to LLVM dialect. The pattern first /// create a 0-sized global array symbol similar as LLVM expects. It constructs /// a memref descriptor with these values and return it. struct GPUDynamicSharedMemoryOpLowering : public ConvertOpToLLVMPattern<gpu::DynamicSharedMemoryOp> { … }; struct GPUFuncOpLoweringOptions { … }; struct GPUFuncOpLowering : ConvertOpToLLVMPattern<gpu::GPUFuncOp> { … }; /// The lowering of gpu.printf to a call to HIP hostcalls /// /// Simplifies llvm/lib/Transforms/Utils/AMDGPUEmitPrintf.cpp, as we don't have /// to deal with %s (even if there were first-class strings in MLIR, they're not /// legal input to gpu.printf) or non-constant format strings struct GPUPrintfOpToHIPLowering : public ConvertOpToLLVMPattern<gpu::PrintfOp> { … }; /// The lowering of gpu.printf to a call to an external printf() function /// /// This pass will add a declaration of printf() to the GPUModule if needed /// and separate out the format strings into global constants. For some /// runtimes, such as OpenCL on AMD, this is sufficient setup, as the compiler /// will lower printf calls to appropriate device-side code struct GPUPrintfOpToLLVMCallLowering : public ConvertOpToLLVMPattern<gpu::PrintfOp> { … }; /// Lowering of gpu.printf to a vprintf standard library. struct GPUPrintfOpToVPrintfLowering : public ConvertOpToLLVMPattern<gpu::PrintfOp> { … }; struct GPUReturnOpLowering : public ConvertOpToLLVMPattern<gpu::ReturnOp> { … }; namespace impl { /// Unrolls op if it's operating on vectors. LogicalResult scalarizeVectorOp(Operation *op, ValueRange operands, ConversionPatternRewriter &rewriter, const LLVMTypeConverter &converter); } // namespace impl /// Rewriting that unrolls SourceOp to scalars if it's operating on vectors. template <typename SourceOp> struct ScalarizeVectorOpLowering : public ConvertOpToLLVMPattern<SourceOp> { … }; } // namespace mlir #endif // MLIR_CONVERSION_GPUCOMMON_GPUOPSLOWERING_H_