[clang] 9ee55e7 - [CIR] Implement folder for VecSplatOp (#143771)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 19 00:01:54 PDT 2025
Author: Amr Hesham
Date: 2025-06-19T09:01:51+02:00
New Revision: 9ee55e717308757b580dff182fc23b40d1c18a56
URL: https://github.com/llvm/llvm-project/commit/9ee55e717308757b580dff182fc23b40d1c18a56
DIFF: https://github.com/llvm/llvm-project/commit/9ee55e717308757b580dff182fc23b40d1c18a56.diff
LOG: [CIR] Implement folder for VecSplatOp (#143771)
This change adds a folder for the VecSplatOp
Issue https://github.com/llvm/llvm-project/issues/136487
Added:
clang/test/CIR/Transforms/vector-splat.cir
Modified:
clang/lib/CIR/Dialect/Transforms/CIRSimplify.cpp
clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
Removed:
################################################################################
diff --git a/clang/lib/CIR/Dialect/Transforms/CIRSimplify.cpp b/clang/lib/CIR/Dialect/Transforms/CIRSimplify.cpp
index 67ed4124f26cc..3b7f08c441405 100644
--- a/clang/lib/CIR/Dialect/Transforms/CIRSimplify.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/CIRSimplify.cpp
@@ -260,6 +260,31 @@ struct SimplifySwitch : public OpRewritePattern<SwitchOp> {
}
};
+struct SimplifyVecSplat : public OpRewritePattern<VecSplatOp> {
+ using OpRewritePattern<VecSplatOp>::OpRewritePattern;
+ LogicalResult matchAndRewrite(VecSplatOp op,
+ PatternRewriter &rewriter) const override {
+ mlir::Value splatValue = op.getValue();
+ auto constant =
+ mlir::dyn_cast_if_present<cir::ConstantOp>(splatValue.getDefiningOp());
+ if (!constant)
+ return mlir::failure();
+
+ auto value = constant.getValue();
+ if (!mlir::isa_and_nonnull<cir::IntAttr>(value) &&
+ !mlir::isa_and_nonnull<cir::FPAttr>(value))
+ return mlir::failure();
+
+ cir::VectorType resultType = op.getResult().getType();
+ SmallVector<mlir::Attribute, 16> elements(resultType.getSize(), value);
+ auto constVecAttr = cir::ConstVectorAttr::get(
+ resultType, mlir::ArrayAttr::get(getContext(), elements));
+
+ rewriter.replaceOpWithNewOp<cir::ConstantOp>(op, constVecAttr);
+ return mlir::success();
+ }
+};
+
//===----------------------------------------------------------------------===//
// CIRSimplifyPass
//===----------------------------------------------------------------------===//
@@ -275,7 +300,8 @@ void populateMergeCleanupPatterns(RewritePatternSet &patterns) {
patterns.add<
SimplifyTernary,
SimplifySelect,
- SimplifySwitch
+ SimplifySwitch,
+ SimplifyVecSplat
>(patterns.getContext());
// clang-format on
}
@@ -288,7 +314,7 @@ void CIRSimplifyPass::runOnOperation() {
// Collect operations to apply patterns.
llvm::SmallVector<Operation *, 16> ops;
getOperation()->walk([&](Operation *op) {
- if (isa<TernaryOp, SelectOp, SwitchOp>(op))
+ if (isa<TernaryOp, SelectOp, SwitchOp, VecSplatOp>(op))
ops.push_back(op);
});
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index b73cb839828ee..5f41e340e2474 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -979,9 +979,7 @@ mlir::LogicalResult CIRToLLVMConstantOpLowering::matchAndRewrite(
}
attr = rewriter.getArrayAttr(components);
- }
-
- else {
+ } else {
return op.emitError() << "unsupported constant type " << op.getType();
}
diff --git a/clang/test/CIR/Transforms/vector-splat.cir b/clang/test/CIR/Transforms/vector-splat.cir
new file mode 100644
index 0000000000000..e2274b8627b17
--- /dev/null
+++ b/clang/test/CIR/Transforms/vector-splat.cir
@@ -0,0 +1,16 @@
+// RUN: cir-opt %s -cir-simplify -o - | FileCheck %s
+
+!s32i = !cir.int<s, 32>
+
+module {
+ cir.func @fold_shuffle_vector_op_test() -> !cir.vector<4 x !s32i> {
+ %v = cir.const #cir.int<3> : !s32i
+ %vec = cir.vec.splat %v : !s32i, !cir.vector<4 x !s32i>
+ cir.return %vec : !cir.vector<4 x !s32i>
+ }
+
+ // CHECK: cir.func @fold_shuffle_vector_op_test() -> !cir.vector<4 x !s32i> {
+ // CHECK-NEXT: %0 = cir.const #cir.const_vector<[#cir.int<3> : !s32i, #cir.int<3> : !s32i,
+ // CHECK-SAME: #cir.int<3> : !s32i, #cir.int<3> : !s32i]> : !cir.vector<4 x !s32i>
+ // CHECK-NEXT: cir.return %0 : !cir.vector<4 x !s32i>
+}
More information about the cfe-commits
mailing list