[Mlir-commits] [mlir] [[mlir][Vector] Add simple folders for `vector.from_element`/`vector.to_elements` (PR #144444)
Jakub Kuderski
llvmlistbot at llvm.org
Wed Jun 18 13:54:20 PDT 2025
================
@@ -2370,10 +2370,100 @@ std::optional<SmallVector<int64_t, 4>> FMAOp::getShapeForUnroll() {
return llvm::to_vector<4>(getVectorType().getShape());
}
+//===----------------------------------------------------------------------===//
+// ToElementsOp
+//===----------------------------------------------------------------------===//
+
+/// Returns true if all the `operands` are defined by `defOp`.
+/// Otherwise, returns false.
+static bool haveSameDefiningOp(OperandRange operands, Operation *defOp) {
+ if (operands.empty())
+ return false;
+
+ return llvm::all_of(operands, [&](Value operand) {
+ Operation *currentDef = operand.getDefiningOp();
+ return currentDef == defOp;
+ });
+}
+
+/// Folds vector.to_elements(vector.from_elements(%e0, %e1, ...)) into
+/// (%e0, %e1, ...). For example:
+///
+/// %0 = vector.from_elements %a, %b, %c : vector<3xf32>
+/// %1:3 = vector.to_elements %0 : vector<3xf32>
+/// user_op %1#0, %1#1, %1#2
+///
+/// becomes:
+///
+/// user_op %a, %b, %c
+///
+static LogicalResult
+foldToElementsFromElements(ToElementsOp toElementsOp,
+ SmallVectorImpl<OpFoldResult> &results) {
+ auto fromElementsOp = toElementsOp.getSource().getDefiningOp<FromElementsOp>();
+ if (!fromElementsOp)
+ return failure();
+
+ results.append(fromElementsOp.getElements().begin(),
+ fromElementsOp.getElements().end());
+ return success();
+}
+
+LogicalResult ToElementsOp::fold(FoldAdaptor adaptor,
+ SmallVectorImpl<OpFoldResult> &results) {
+ if (succeeded(foldToElementsFromElements(*this, results)))
+ return success();
+ return failure();
+}
+
//===----------------------------------------------------------------------===//
// FromElementsOp
//===----------------------------------------------------------------------===//
+/// Folds vector.from_elements(vector.to_elements(%vector)) into %vector.
+///
+/// Case #1: Input and output vectors are the same.
+///
+/// %0:3 = vector.to_elements %a : vector<3xf32>
+/// %1 = vector.from_elements %0#0, %0#1, %0#2 : vector<3xf32>
+/// user_op %1
+///
+/// becomes:
+///
+/// user_op %a
+///
+static OpFoldResult foldFromElementsToElements(FromElementsOp fromElementsOp) {
+ auto fromElemsOperands = fromElementsOp.getElements();
----------------
kuhar wrote:
Without an IDE I can't tell what the type is. I think `auto` hinders readability here.
https://github.com/llvm/llvm-project/pull/144444
More information about the Mlir-commits
mailing list