@@ -303,4 +303,94 @@ def Iterators_SinkOp : Iterators_Base_Op<"sink"> {
303
303
let arguments = (ins Iterators_StreamOfLLVMStructOfNumerics:$input);
304
304
}
305
305
306
+ //===----------------------------------------------------------------------===//
307
+ // Ops related to Iterator bodies.
308
+ //===----------------------------------------------------------------------===//
309
+
310
+ def Iterators_UndefStateOp : Iterators_Base_Op<"undefstate", [NoSideEffect]> {
311
+ let summary = "Create an undefined iterator state";
312
+ let results = (outs Iterators_State:$result);
313
+ let assemblyFormat = "attr-dict `:` qualified(type($result))";
314
+ let description = [{
315
+ Creates an iterator state of the given type with undefined field values.
316
+ All fields have to be set individually with `insertvalue` before the whole
317
+ state is fully defined.
318
+
319
+ This is similar to `llvm.undef` for `llvm.struct`.
320
+
321
+ Example:
322
+
323
+ ```
324
+ %undef_state = iterators.undefstate : !iterators.state<i32, tensor<?xi32>>
325
+ ```
326
+ }];
327
+ }
328
+
329
+ def Iterators_ExtractValueOp : Iterators_Base_Op<"extractvalue", [
330
+ NoSideEffect,
331
+ PredOpTrait<"index must exist in state",
332
+ CPred<"static_cast<uint64_t>($index.cast<IntegerAttr>().getInt())"
333
+ " < $state.getType().cast<StateType>().getFieldTypes().size()">>,
334
+ AllMatch<["$state.getType().cast<StateType>().getFieldTypes()"
335
+ " [$index.cast<IntegerAttr>().getInt()]",
336
+ "$result.getType()"],
337
+ "the return type must match the field type at the given index">,
338
+ DeclareOpInterfaceMethods<InferTypeOpInterface>
339
+ ]> {
340
+ let summary = "Extract the field value of the state";
341
+ let arguments = (ins Iterators_State:$state, IndexAttr:$index);
342
+ let results = (outs AnyType:$result);
343
+ let assemblyFormat = [{
344
+ $state `[` $index `]` attr-dict `:` qualified(type($state))
345
+ }];
346
+ let description = [{
347
+ Extracts the value of the given iterator state at the given index.
348
+
349
+ This is similar to `llvm.extractvalue` for `llvm.struct`.
350
+
351
+ Example:
352
+
353
+ ```
354
+ %state = ...
355
+ %value = iterators.extractvalue %state[0] :
356
+ !iterators.state<i32, tensor<?xi32>>
357
+ ```
358
+ }];
359
+ }
360
+
361
+ def Iterators_InsertValueOp : Iterators_Base_Op<"insertvalue", [
362
+ NoSideEffect,
363
+ PredOpTrait<
364
+ "index must exist in state",
365
+ CPred<"static_cast<uint64_t>($index.cast<IntegerAttr>().getInt())"
366
+ " < $state.getType().cast<StateType>().getFieldTypes().size()">>,
367
+ AllMatch<["$state.getType().cast<StateType>().getFieldTypes()"
368
+ " [$index.cast<IntegerAttr>().getInt()]",
369
+ "$value.getType()"],
370
+ "the value type must match the field type at the given index">,
371
+ AllTypesMatch<["state", "result"]>
372
+ ]> {
373
+ let summary = "Insert a field value into the state";
374
+ let arguments = (ins Iterators_State:$state, IndexAttr:$index, AnyType:$value);
375
+ let results = (outs Iterators_State:$result);
376
+ let assemblyFormat = [{
377
+ $value `into` $state `[` $index `]` attr-dict `:` qualified(type($state))
378
+ custom<InsertValueType>(type($value), ref(type($state)), ref($index))
379
+ }];
380
+ let description = [{
381
+ Inserts the given value into the given iterator state at the given index.
382
+
383
+ This is similar to `llvm.insertvalue` for `llvm.struct`.
384
+
385
+ Example:
386
+
387
+ ```
388
+ %state = ...
389
+ %value = ...
390
+ %updated_state = iterators.insertvalue %state[0] (%value : i32) :
391
+ !iterators.state<i32, tensor<?xi32>>
392
+ ```
393
+ }];
394
+ }
395
+
306
396
#endif // ITERATORS_DIALECT_ITERATORS_IR_ITERATORSOPS
0 commit comments