[Mlir-commits] [mlir] [mlir][vector] Propagate `vector.extract` through elementwise ops (PR #131462)
Ivan Butygin
llvmlistbot at llvm.org
Sat Mar 22 16:16:16 PDT 2025
================
@@ -1043,6 +1043,60 @@ struct ReorderElementwiseOpsOnBroadcast final
}
};
+/// Pattern to rewrite a ExtractOp(Elementwise) -> Elementwise(ExtractOp).
+/// This may result in more efficient code when we extracting a single value
+/// from multi-element vector and also to help canonicalize 1-element vectors to
+/// scalars.
+/// ```
+/// %0 = arith.addf %arg0, %arg1 : vector<4xf32>
+/// %1 = vector.extract %0[1] : f32 from vector<4xf32>
+/// ```
+/// Gets converted to:
+/// ```
+/// %0 = vector.extract %arg0[1] : f32 from vector<4xf32>
+/// %1 = vector.extract %arg1[1] : f32 from vector<4xf32>
+/// %2 = arith.addf %0, %1 : f32
+/// ```
+class ExtractOpFromElementwise final
+ : public OpRewritePattern<vector::ExtractOp> {
+public:
+ using OpRewritePattern::OpRewritePattern;
+
+ LogicalResult matchAndRewrite(vector::ExtractOp op,
+ PatternRewriter &rewriter) const override {
+ Operation *eltwise = op.getVector().getDefiningOp();
+
+ // Elementwise op with single result and `extract` is single user.
+ if (!eltwise || !OpTrait::hasElementwiseMappableTraits(eltwise) ||
+ eltwise->getNumResults() != 1 || !eltwise->hasOneUse())
+ return rewriter.notifyMatchFailure(op, "not a suitable op");
----------------
Hardcode84 wrote:
done
https://github.com/llvm/llvm-project/pull/131462
More information about the Mlir-commits
mailing list