summaryrefslogtreecommitdiff
path: root/mlir/test/lib/Dialect/Test/TestDialect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/test/lib/Dialect/Test/TestDialect.cpp')
-rw-r--r--mlir/test/lib/Dialect/Test/TestDialect.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/mlir/test/lib/Dialect/Test/TestDialect.cpp b/mlir/test/lib/Dialect/Test/TestDialect.cpp
index 987e8f3654ce..21d75f58b0a3 100644
--- a/mlir/test/lib/Dialect/Test/TestDialect.cpp
+++ b/mlir/test/lib/Dialect/Test/TestDialect.cpp
@@ -431,3 +431,47 @@ void TestDialect::getCanonicalizationPatterns(
RewritePatternSet &results) const {
results.add(&dialectCanonicalizationPattern);
}
+
+//===----------------------------------------------------------------------===//
+// TestCallWithSegmentsOp
+//===----------------------------------------------------------------------===//
+// The op `test.call_with_segments` models a call-like operation whose operands
+// are divided into 3 variadic segments: `prefix`, `args`, and `suffix`.
+// Only the middle segment represents the actual call arguments. The op uses
+// the AttrSizedOperandSegments trait, so we can derive segment boundaries from
+// the generated `operandSegmentSizes` attribute. We provide custom helpers to
+// expose the logical call arguments as both a read-only range and a mutable
+// range bound to the proper segment so that insertion/erasure updates the
+// attribute automatically.
+
+// Segment layout indices in the DenseI32ArrayAttr: [prefix, args, suffix].
+static constexpr unsigned kTestCallWithSegmentsArgsSegIndex = 1;
+
+Operation::operand_range CallWithSegmentsOp::getArgOperands() {
+ // Leverage generated getters for segment sizes: slice between prefix and
+ // suffix using current operand list.
+ return getOperation()->getOperands().slice(getPrefix().size(),
+ getArgs().size());
+}
+
+MutableOperandRange CallWithSegmentsOp::getArgOperandsMutable() {
+ Operation *op = getOperation();
+
+ // Obtain the canonical segment size attribute name for this op.
+ auto segName =
+ CallWithSegmentsOp::getOperandSegmentSizesAttrName(op->getName());
+ auto sizesAttr = op->getAttrOfType<DenseI32ArrayAttr>(segName);
+ assert(sizesAttr && "missing operandSegmentSizes attribute on op");
+
+ // Compute the start and length of the args segment from the prefix size and
+ // args size stored in the attribute.
+ auto sizes = sizesAttr.asArrayRef();
+ unsigned start = static_cast<unsigned>(sizes[0]); // prefix size
+ unsigned len = static_cast<unsigned>(sizes[1]); // args size
+
+ NamedAttribute segNamed(segName, sizesAttr);
+ MutableOperandRange::OperandSegment binding{kTestCallWithSegmentsArgsSegIndex,
+ segNamed};
+
+ return MutableOperandRange(op, start, len, {binding});
+}