Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 1 | //===- IndexIntrinsicsOpLowering.h - GPU IndexOps Lowering class *- C++ -*-===// |
| 2 | // |
Mehdi Amini | 3085710 | 2020-01-26 03:58:30 | [diff] [blame] | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
Mehdi Amini | 56222a0 | 2019-12-23 17:35:36 | [diff] [blame] | 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 6 | // |
Mehdi Amini | 56222a0 | 2019-12-23 17:35:36 | [diff] [blame] | 7 | //===----------------------------------------------------------------------===// |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 8 | #ifndef MLIR_CONVERSION_GPUCOMMON_INDEXINTRINSICSOPLOWERING_H_ |
| 9 | #define MLIR_CONVERSION_GPUCOMMON_INDEXINTRINSICSOPLOWERING_H_ |
| 10 | |
Alex Zinenko | 75e5f0a | 2021-07-08 16:35:18 | [diff] [blame] | 11 | #include "mlir/Conversion/LLVMCommon/Pattern.h" |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 12 | #include "mlir/Dialect/GPU/GPUDialect.h" |
| 13 | #include "mlir/Dialect/LLVMIR/LLVMDialect.h" |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 14 | #include "llvm/ADT/StringSwitch.h" |
| 15 | |
| 16 | namespace mlir { |
| 17 | |
| 18 | // Rewriting that replaces Op with XOp, YOp, or ZOp depending on the dimension |
River Riddle | 23aa5a7 | 2022-02-26 22:49:54 | [diff] [blame^] | 19 | // that Op operates on. Op is assumed to return an `index` value and |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 20 | // XOp, YOp and ZOp are assumed to return an `llvm.i32` value. Depending on |
| 21 | // `indexBitwidth`, sign-extend or truncate the resulting value to match the |
| 22 | // bitwidth expected by the consumers of the value. |
| 23 | template <typename Op, typename XOp, typename YOp, typename ZOp> |
Rahul Joshi | 563879b | 2020-12-10 02:18:35 | [diff] [blame] | 24 | struct GPUIndexIntrinsicOpLowering : public ConvertOpToLLVMPattern<Op> { |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 25 | private: |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 26 | unsigned indexBitwidth; |
| 27 | |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 28 | public: |
Stephan Herhut | ac9d742b | 2020-03-26 11:12:06 | [diff] [blame] | 29 | explicit GPUIndexIntrinsicOpLowering(LLVMTypeConverter &typeConverter) |
Rahul Joshi | 563879b | 2020-12-10 02:18:35 | [diff] [blame] | 30 | : ConvertOpToLLVMPattern<Op>(typeConverter), |
Stephan Herhut | ac9d742b | 2020-03-26 11:12:06 | [diff] [blame] | 31 | indexBitwidth(typeConverter.getIndexTypeBitwidth()) {} |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 32 | |
| 33 | // Convert the kernel arguments to an LLVM type, preserve the rest. |
River Riddle | 3145427 | 2020-03-18 03:07:55 | [diff] [blame] | 34 | LogicalResult |
River Riddle | ef97633 | 2021-09-24 17:51:20 | [diff] [blame] | 35 | matchAndRewrite(Op op, typename Op::Adaptor adaptor, |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 36 | ConversionPatternRewriter &rewriter) const override { |
| 37 | auto loc = op->getLoc(); |
Alex Zinenko | 5446ec8 | 2020-08-05 22:52:20 | [diff] [blame] | 38 | MLIRContext *context = rewriter.getContext(); |
River Riddle | e62a695 | 2019-12-23 22:45:01 | [diff] [blame] | 39 | Value newOp; |
Mogball | aae5125 | 2022-01-18 16:53:55 | [diff] [blame] | 40 | switch (op.dimension()) { |
| 41 | case gpu::Dimension::x: |
Alex Zinenko | 2230bf9 | 2021-01-06 15:19:04 | [diff] [blame] | 42 | newOp = rewriter.create<XOp>(loc, IntegerType::get(context, 32)); |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 43 | break; |
Mogball | aae5125 | 2022-01-18 16:53:55 | [diff] [blame] | 44 | case gpu::Dimension::y: |
Alex Zinenko | 2230bf9 | 2021-01-06 15:19:04 | [diff] [blame] | 45 | newOp = rewriter.create<YOp>(loc, IntegerType::get(context, 32)); |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 46 | break; |
Mogball | aae5125 | 2022-01-18 16:53:55 | [diff] [blame] | 47 | case gpu::Dimension::z: |
Alex Zinenko | 2230bf9 | 2021-01-06 15:19:04 | [diff] [blame] | 48 | newOp = rewriter.create<ZOp>(loc, IntegerType::get(context, 32)); |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 49 | break; |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | if (indexBitwidth > 32) { |
| 53 | newOp = rewriter.create<LLVM::SExtOp>( |
Alex Zinenko | 2230bf9 | 2021-01-06 15:19:04 | [diff] [blame] | 54 | loc, IntegerType::get(context, indexBitwidth), newOp); |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 55 | } else if (indexBitwidth < 32) { |
| 56 | newOp = rewriter.create<LLVM::TruncOp>( |
Alex Zinenko | 2230bf9 | 2021-01-06 15:19:04 | [diff] [blame] | 57 | loc, IntegerType::get(context, indexBitwidth), newOp); |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 58 | } |
| 59 | |
| 60 | rewriter.replaceOp(op, {newOp}); |
River Riddle | 3145427 | 2020-03-18 03:07:55 | [diff] [blame] | 61 | return success(); |
Deven Desai | d064469 | 2019-10-04 13:19:25 | [diff] [blame] | 62 | } |
| 63 | }; |
| 64 | |
| 65 | } // namespace mlir |
| 66 | |
| 67 | #endif // MLIR_CONVERSION_GPUCOMMON_INDEXINTRINSICSOPLOWERING_H_ |