@@ -98,23 +98,36 @@ class ROCDL_IntrOp<string mnemonic, list<int> overloadedResults,
9898// ROCDL special register op definitions
9999//===----------------------------------------------------------------------===//
100100
101- class ROCDL_SpecialRegisterOp<string mnemonic,
102- list<Trait> traits = []> :
103- ROCDL_Op<mnemonic, !listconcat(traits, [Pure])>,
104- Results<(outs LLVM_Type:$res)>, Arguments<(ins)> {
105- string llvmBuilder = "$res = createIntrinsicCallWithRange(builder,"
106- # "llvm::Intrinsic::amdgcn_" # !subst(".","_", mnemonic)
107- # ", op->getAttrOfType<::mlir::DenseI32ArrayAttr>(\"range\"));";
108- let assemblyFormat = "attr-dict `:` type($res)";
101+ class ROCDL_SpecialIdRegisterOp<string mnemonic> :
102+ ROCDL_IntrPure1Op<mnemonic>,
103+ Arguments<(ins OptionalAttr<LLVM_ConstantRangeAttr>:$range)> {
104+ string llvmBuilder = baseLlvmBuilder # setRangeRetAttrCode # baseLlvmBuilderCoda;
105+ string mlirBuilder = baseMlirBuilder # importRangeRetAttrCode # baseMlirBuilderCoda;
106+
107+ let assemblyFormat = "(`range` $range^)? attr-dict `:` type($res)";
108+
109+ // Temporaly builder until Nvidia ops also support range attributes.
110+ let builders = [
111+ OpBuilder<(ins "Type":$resultType), [{
112+ build($_builder, $_state, resultType, ::mlir::LLVM::ConstantRangeAttr{});
113+ }]>
114+ ];
109115}
110116
111- class ROCDL_DeviceFunctionOp <string mnemonic, string device_function,
117+ class ROCDL_DimGetterFunctionOp <string mnemonic, string device_function,
112118 int parameter, list<Trait> traits = []> :
113119 ROCDL_Op<mnemonic, !listconcat(traits, [Pure])>,
114- Results<(outs LLVM_Type:$res)>, Arguments<(ins)> {
115- string llvmBuilder = "$res = createDeviceFunctionCall (builder, \""
120+ Results<(outs LLVM_Type:$res)>, Arguments<(ins OptionalAttr<LLVM_ConstantRangeAttr>:$range )> {
121+ string llvmBuilder = "$res = createDimGetterFunctionCall (builder, op , \""
116122 # device_function # "\", " # parameter # ");";
117- let assemblyFormat = "attr-dict `:` type($res)";
123+ let assemblyFormat = "(`range` $range^)? attr-dict `:` type($res)";
124+
125+ // Temporaly builder until Nvidia ops also support range attributes.
126+ let builders = [
127+ OpBuilder<(ins "Type":$resultType), [{
128+ build($_builder, $_state, resultType, ::mlir::LLVM::ConstantRangeAttr{});
129+ }]>
130+ ];
118131}
119132
120133//===----------------------------------------------------------------------===//
@@ -181,33 +194,33 @@ def ROCDL_BallotOp :
181194//===----------------------------------------------------------------------===//
182195// Thread index and Block index
183196
184- def ROCDL_ThreadIdXOp : ROCDL_SpecialRegisterOp <"workitem.id.x">;
185- def ROCDL_ThreadIdYOp : ROCDL_SpecialRegisterOp <"workitem.id.y">;
186- def ROCDL_ThreadIdZOp : ROCDL_SpecialRegisterOp <"workitem.id.z">;
197+ def ROCDL_ThreadIdXOp : ROCDL_SpecialIdRegisterOp <"workitem.id.x">;
198+ def ROCDL_ThreadIdYOp : ROCDL_SpecialIdRegisterOp <"workitem.id.y">;
199+ def ROCDL_ThreadIdZOp : ROCDL_SpecialIdRegisterOp <"workitem.id.z">;
187200
188- def ROCDL_BlockIdXOp : ROCDL_SpecialRegisterOp <"workgroup.id.x">;
189- def ROCDL_BlockIdYOp : ROCDL_SpecialRegisterOp <"workgroup.id.y">;
190- def ROCDL_BlockIdZOp : ROCDL_SpecialRegisterOp <"workgroup.id.z">;
201+ def ROCDL_BlockIdXOp : ROCDL_SpecialIdRegisterOp <"workgroup.id.x">;
202+ def ROCDL_BlockIdYOp : ROCDL_SpecialIdRegisterOp <"workgroup.id.y">;
203+ def ROCDL_BlockIdZOp : ROCDL_SpecialIdRegisterOp <"workgroup.id.z">;
191204
192205//===----------------------------------------------------------------------===//
193206// Thread range and Block range
194207
195- def ROCDL_BlockDimXOp : ROCDL_DeviceFunctionOp <"workgroup.dim.x",
208+ def ROCDL_BlockDimXOp : ROCDL_DimGetterFunctionOp <"workgroup.dim.x",
196209 "__ockl_get_local_size", 0>;
197210
198- def ROCDL_BlockDimYOp : ROCDL_DeviceFunctionOp <"workgroup.dim.y",
211+ def ROCDL_BlockDimYOp : ROCDL_DimGetterFunctionOp <"workgroup.dim.y",
199212 "__ockl_get_local_size", 1>;
200213
201- def ROCDL_BlockDimZOp : ROCDL_DeviceFunctionOp <"workgroup.dim.z",
214+ def ROCDL_BlockDimZOp : ROCDL_DimGetterFunctionOp <"workgroup.dim.z",
202215 "__ockl_get_local_size", 2>;
203216
204- def ROCDL_GridDimXOp : ROCDL_DeviceFunctionOp <"grid.dim.x",
217+ def ROCDL_GridDimXOp : ROCDL_DimGetterFunctionOp <"grid.dim.x",
205218 "__ockl_get_num_groups", 0>;
206219
207- def ROCDL_GridDimYOp : ROCDL_DeviceFunctionOp <"grid.dim.y",
220+ def ROCDL_GridDimYOp : ROCDL_DimGetterFunctionOp <"grid.dim.y",
208221 "__ockl_get_num_groups", 1>;
209222
210- def ROCDL_GridDimZOp : ROCDL_DeviceFunctionOp <"grid.dim.z",
223+ def ROCDL_GridDimZOp : ROCDL_DimGetterFunctionOp <"grid.dim.z",
211224 "__ockl_get_num_groups", 2>;
212225
213226//===----------------------------------------------------------------------===//
0 commit comments