blob: 97006b199b3f24e00a0a08161ca84e5fe3e1abee [file] [log] [blame]
Deven Desaid0644692019-10-04 13:19:251//===- IndexIntrinsicsOpLowering.h - GPU IndexOps Lowering class *- C++ -*-===//
2//
Mehdi Amini30857102020-01-26 03:58:303// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
Mehdi Amini56222a02019-12-23 17:35:364// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Deven Desaid0644692019-10-04 13:19:256//
Mehdi Amini56222a02019-12-23 17:35:367//===----------------------------------------------------------------------===//
Deven Desaid0644692019-10-04 13:19:258#ifndef MLIR_CONVERSION_GPUCOMMON_INDEXINTRINSICSOPLOWERING_H_
9#define MLIR_CONVERSION_GPUCOMMON_INDEXINTRINSICSOPLOWERING_H_
10
Alex Zinenko75e5f0a2021-07-08 16:35:1811#include "mlir/Conversion/LLVMCommon/Pattern.h"
Deven Desaid0644692019-10-04 13:19:2512#include "mlir/Dialect/GPU/GPUDialect.h"
13#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
Deven Desaid0644692019-10-04 13:19:2514#include "llvm/ADT/StringSwitch.h"
15
16namespace mlir {
17
18// Rewriting that replaces Op with XOp, YOp, or ZOp depending on the dimension
River Riddle23aa5a72022-02-26 22:49:5419// that Op operates on. Op is assumed to return an `index` value and
Deven Desaid0644692019-10-04 13:19:2520// 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.
23template <typename Op, typename XOp, typename YOp, typename ZOp>
Rahul Joshi563879b2020-12-10 02:18:3524struct GPUIndexIntrinsicOpLowering : public ConvertOpToLLVMPattern<Op> {
Deven Desaid0644692019-10-04 13:19:2525private:
Deven Desaid0644692019-10-04 13:19:2526 unsigned indexBitwidth;
27
Deven Desaid0644692019-10-04 13:19:2528public:
Stephan Herhutac9d742b2020-03-26 11:12:0629 explicit GPUIndexIntrinsicOpLowering(LLVMTypeConverter &typeConverter)
Rahul Joshi563879b2020-12-10 02:18:3530 : ConvertOpToLLVMPattern<Op>(typeConverter),
Stephan Herhutac9d742b2020-03-26 11:12:0631 indexBitwidth(typeConverter.getIndexTypeBitwidth()) {}
Deven Desaid0644692019-10-04 13:19:2532
33 // Convert the kernel arguments to an LLVM type, preserve the rest.
River Riddle31454272020-03-18 03:07:5534 LogicalResult
River Riddleef976332021-09-24 17:51:2035 matchAndRewrite(Op op, typename Op::Adaptor adaptor,
Deven Desaid0644692019-10-04 13:19:2536 ConversionPatternRewriter &rewriter) const override {
37 auto loc = op->getLoc();
Alex Zinenko5446ec82020-08-05 22:52:2038 MLIRContext *context = rewriter.getContext();
River Riddlee62a6952019-12-23 22:45:0139 Value newOp;
Mogballaae51252022-01-18 16:53:5540 switch (op.dimension()) {
41 case gpu::Dimension::x:
Alex Zinenko2230bf92021-01-06 15:19:0442 newOp = rewriter.create<XOp>(loc, IntegerType::get(context, 32));
Deven Desaid0644692019-10-04 13:19:2543 break;
Mogballaae51252022-01-18 16:53:5544 case gpu::Dimension::y:
Alex Zinenko2230bf92021-01-06 15:19:0445 newOp = rewriter.create<YOp>(loc, IntegerType::get(context, 32));
Deven Desaid0644692019-10-04 13:19:2546 break;
Mogballaae51252022-01-18 16:53:5547 case gpu::Dimension::z:
Alex Zinenko2230bf92021-01-06 15:19:0448 newOp = rewriter.create<ZOp>(loc, IntegerType::get(context, 32));
Deven Desaid0644692019-10-04 13:19:2549 break;
Deven Desaid0644692019-10-04 13:19:2550 }
51
52 if (indexBitwidth > 32) {
53 newOp = rewriter.create<LLVM::SExtOp>(
Alex Zinenko2230bf92021-01-06 15:19:0454 loc, IntegerType::get(context, indexBitwidth), newOp);
Deven Desaid0644692019-10-04 13:19:2555 } else if (indexBitwidth < 32) {
56 newOp = rewriter.create<LLVM::TruncOp>(
Alex Zinenko2230bf92021-01-06 15:19:0457 loc, IntegerType::get(context, indexBitwidth), newOp);
Deven Desaid0644692019-10-04 13:19:2558 }
59
60 rewriter.replaceOp(op, {newOp});
River Riddle31454272020-03-18 03:07:5561 return success();
Deven Desaid0644692019-10-04 13:19:2562 }
63};
64
65} // namespace mlir
66
67#endif // MLIR_CONVERSION_GPUCOMMON_INDEXINTRINSICSOPLOWERING_H_