[Mlir-commits] [mlir] [mlir][IR] MutableOperandRange: `operator[]` returns `OpOperand &` (PR #66515)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Fri Sep 15 07:12:43 PDT 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir
            
<details>
<summary>Changes</summary>
`operator[]` returns `OpOperand &` instead of `Value`.

* This allows users to get OpOperands by name instead of "magic" number. E.g., `extractSliceOp->getOpOperand(0)` can be written as `extractSliceOp.getSourceMutable()[0]`.
* `OperandRange` provides a read-only API to operands: `operator[]` returns `Value`. `MutableOperandRange` now provides a mutable API: `operator[]` returns `OpOperand &`, which can be used to set operands.

Note: The TableGen code generator could be changed to return `OpOperand &` (instead of `MutableOperandRange`) for non-variadic and non-optional arguments in a subsequent change. Then the `[0]` part in the above example would no longer be necessary.
--
Full diff: https://github.com/llvm/llvm-project/pull/66515.diff

8 Files Affected:

- (modified) mlir/include/mlir/IR/ValueRange.h (+2-4) 
- (modified) mlir/include/mlir/Interfaces/ControlFlowInterfaces.h (+1-1) 
- (modified) mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp (+3-7) 
- (modified) mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp (+1-1) 
- (modified) mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp (+1-1) 
- (modified) mlir/lib/Dialect/Tensor/Transforms/BufferizableOpInterfaceImpl.cpp (+6-6) 
- (modified) mlir/lib/IR/OperationSupport.cpp (+4) 
- (modified) mlir/lib/Transforms/Utils/CFGToSCF.cpp (+2-1) 


<pre>
diff --git a/mlir/include/mlir/IR/ValueRange.h b/mlir/include/mlir/IR/ValueRange.h
index 187185b47b66695..f1a1f1841f179e7 100644
--- a/mlir/include/mlir/IR/ValueRange.h
+++ b/mlir/include/mlir/IR/ValueRange.h
@@ -162,10 +162,8 @@ class MutableOperandRange {
   /// elements attribute, which contains the sizes of the sub ranges.
   MutableOperandRangeRange split(NamedAttribute segmentSizes) const;
 
-  /// Returns the value at the given index.
-  Value operator[](unsigned index) const {
-    return operator OperandRange()[index];
-  }
+  /// Returns the OpOperand at the given index.
+  OpOperand &amp;operator[](unsigned index) const;
 
   OperandRange::iterator begin() const {
     return static_cast&lt;OperandRange&gt;(*this).begin();
diff --git a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.h b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.h
index 006aedced839f99..7f6967f11444f31 100644
--- a/mlir/include/mlir/Interfaces/ControlFlowInterfaces.h
+++ b/mlir/include/mlir/Interfaces/ControlFlowInterfaces.h
@@ -76,7 +76,7 @@ class SuccessorOperands {
   Value operator[](unsigned index) const {
     if (isOperandProduced(index))
       return Value();
-    return forwardedOperands[index - producedOperandCount];
+    return forwardedOperands[index - producedOperandCount].get();
   }
 
   /// Get the range of operands that are simply forwarded to the successor.
diff --git a/mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp b/mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp
index e5016c956804688..3a30f1a1405ec11 100644
--- a/mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp
+++ b/mlir/lib/Dialect/Bufferization/IR/BufferizationOps.cpp
@@ -549,22 +549,18 @@ LogicalResult DeallocTensorOp::bufferize(RewriterBase &amp;rewriter,
 
 bool MaterializeInDestinationOp::bufferizesToMemoryRead(
     OpOperand &amp;opOperand, const AnalysisState &amp;state) {
-  if (&amp;opOperand == &amp;getOperation()-&gt;getOpOperand(0) /*source*/)
-    return true;
-  return false;
+  return &amp;opOperand == &amp;getSourceMutable()[0];
 }
 
 bool MaterializeInDestinationOp::bufferizesToMemoryWrite(
     OpOperand &amp;opOperand, const AnalysisState &amp;state) {
-  if (&amp;opOperand == &amp;getOperation()-&gt;getOpOperand(1) /*dest*/)
-    return true;
-  return false;
+  return &amp;opOperand == &amp;getDestMutable()[0];
 }
 
 AliasingValueList
 MaterializeInDestinationOp::getAliasingValues(OpOperand &amp;opOperand,
                                               const AnalysisState &amp;state) {
-  if (&amp;opOperand == &amp;getOperation()-&gt;getOpOperand(1) /*dest*/)
+  if (&amp;opOperand == &amp;getDestMutable()[0])
     return {{getOperation()-&gt;getResult(0), BufferRelation::Equivalent}};
   return {};
 }
diff --git a/mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp b/mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp
index 581e7b0a8ea86a7..6a01c24f026990f 100644
--- a/mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp
+++ b/mlir/lib/Dialect/Linalg/Transforms/ElementwiseOpFusion.cpp
@@ -949,7 +949,7 @@ struct FoldReshapeWithGenericOpByExpansion
           reshapeOp, &quot;failed preconditions of fusion with producer generic op&quot;);
     }
 
-    if (!controlFoldingReshapes(&amp;reshapeOp-&gt;getOpOperand(0))) {
+    if (!controlFoldingReshapes(&amp;reshapeOp.getSrcMutable()[0])) {
       return rewriter.notifyMatchFailure(reshapeOp,
                                          &quot;fusion blocked by control function&quot;);
     }
diff --git a/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp b/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp
index 597676a017bf482..1ce25565edcaf61 100644
--- a/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp
+++ b/mlir/lib/Dialect/SCF/Transforms/TileUsingInterface.cpp
@@ -509,7 +509,7 @@ mlir::scf::tileAndFuseProducerOfSlice(RewriterBase &amp;rewriter,
   // 1. Get the producer of the source (potentially walking through
   // `iter_args` of nested `scf.for`)
   auto [fusableProducer, destinationIterArg] =
-      getUntiledProducerFromSliceSource(&amp;candidateSliceOp-&gt;getOpOperand(0),
+      getUntiledProducerFromSliceSource(&amp;candidateSliceOp.getSourceMutable()[0],
                                         loops);
   if (!fusableProducer)
     return std::nullopt;
diff --git a/mlir/lib/Dialect/Tensor/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/Tensor/Transforms/BufferizableOpInterfaceImpl.cpp
index ecca4dd3394e0ae..ef4352cf0c6592e 100644
--- a/mlir/lib/Dialect/Tensor/Transforms/BufferizableOpInterfaceImpl.cpp
+++ b/mlir/lib/Dialect/Tensor/Transforms/BufferizableOpInterfaceImpl.cpp
@@ -644,11 +644,11 @@ struct InsertSliceOpInterface
     RankedTensorType destType = insertSliceOp.getDestType();
 
     // The source is always read.
-    if (&amp;opOperand == &amp;op-&gt;getOpOperand(0) /*src*/)
+    if (&amp;opOperand == &amp;insertSliceOp.getSourceMutable()[0])
       return true;
 
     // For the destination, it depends...
-    assert(&amp;opOperand == &amp;insertSliceOp-&gt;getOpOperand(1) &amp;&amp; &quot;expected dest&quot;);
+    assert(&amp;opOperand == &amp;insertSliceOp.getDestMutable()[0] &amp;&amp; &quot;expected dest&quot;);
 
     // Dest is not read if it is entirely overwritten. E.g.:
     // tensor.insert_slice %a into %t[0][10][1] : ... into tensor&lt;10xf32&gt;
@@ -851,9 +851,8 @@ struct ReshapeOpInterface
                                                     tensor::ReshapeOp&gt; {
   bool bufferizesToMemoryRead(Operation *op, OpOperand &amp;opOperand,
                               const AnalysisState &amp;state) const {
-    if (&amp;opOperand == &amp;op-&gt;getOpOperand(1) /* shape */)
-      return true;
-    return false;
+    auto reshapeOp = cast&lt;tensor::ReshapeOp&gt;(op);
+    return &amp;opOperand == &amp;reshapeOp.getShapeMutable()[0];
   }
 
   bool bufferizesToMemoryWrite(Operation *op, OpOperand &amp;opOperand,
@@ -915,7 +914,8 @@ struct ParallelInsertSliceOpInterface
 
   bool bufferizesToMemoryWrite(Operation *op, OpOperand &amp;opOperand,
                                const AnalysisState &amp;state) const {
-    return &amp;opOperand == &amp;op-&gt;getOpOperand(1) /*dest*/;
+    auto parallelInsertSliceOp = cast&lt;ParallelInsertSliceOp&gt;(op);
+    return &amp;opOperand == &amp;parallelInsertSliceOp.getDestMutable()[0];
   }
 
   LogicalResult bufferize(Operation *op, RewriterBase &amp;rewriter,
diff --git a/mlir/lib/IR/OperationSupport.cpp b/mlir/lib/IR/OperationSupport.cpp
index 0cb6a1cd191b161..8b8eeabf38f476f 100644
--- a/mlir/lib/IR/OperationSupport.cpp
+++ b/mlir/lib/IR/OperationSupport.cpp
@@ -517,6 +517,10 @@ void MutableOperandRange::updateLength(unsigned newLength) {
   }
 }
 
+OpOperand &amp;MutableOperandRange::operator[](unsigned index) const {
+  return owner-&gt;getOpOperand(start + index);
+}
+
 //===----------------------------------------------------------------------===//
 // MutableOperandRangeRange
 
diff --git a/mlir/lib/Transforms/Utils/CFGToSCF.cpp b/mlir/lib/Transforms/Utils/CFGToSCF.cpp
index 84f23584e9f30e3..9aab89ed7553600 100644
--- a/mlir/lib/Transforms/Utils/CFGToSCF.cpp
+++ b/mlir/lib/Transforms/Utils/CFGToSCF.cpp
@@ -277,7 +277,8 @@ class EdgeMultiplexer {
       if (index &gt;= result-&gt;second &amp;&amp;
           index &lt; result-&gt;second + edge.getSuccessor()-&gt;getNumArguments()) {
         // Original block arguments to the entry block.
-        newSuccOperands[index] = successorOperands[index - result-&gt;second];
+        newSuccOperands[index] =
+            successorOperands[index - result-&gt;second].get();
         continue;
       }
 
</pre>
</details>


https://github.com/llvm/llvm-project/pull/66515


More information about the Mlir-commits mailing list