Author: Amr Hesham Date: 2026-02-22T17:03:54+01:00 New Revision: 0d0012ec63dfd02a124c8b3c96683eb4103051aa
URL: https://github.com/llvm/llvm-project/commit/0d0012ec63dfd02a124c8b3c96683eb4103051aa DIFF: https://github.com/llvm/llvm-project/commit/0d0012ec63dfd02a124c8b3c96683eb4103051aa.diff LOG: [CIR] Emit cir.zero directly in Vector logical ops (#182703) Emit `cir.zero` directly instead of `vec.create<n, 0>` that will be folded to `cir.const_vector<n, 0>` later Added: Modified: clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp clang/test/CIR/CodeGen/vector-ext.cpp clang/test/CIR/CodeGen/vector.cpp Removed: ################################################################################ diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp index 2c5a57e1ba2ee..d523aa2fdb737 100644 --- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp @@ -1287,10 +1287,8 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> { mlir::Value VisitBinLAnd(const clang::BinaryOperator *e) { if (e->getType()->isVectorType()) { mlir::Location loc = cgf.getLoc(e->getExprLoc()); - auto vecTy = mlir::cast<cir::VectorType>(cgf.convertType(e->getType())); - mlir::Value zeroValue = builder.getNullValue(vecTy.getElementType(), loc); - SmallVector<mlir::Value, 16> elements(vecTy.getSize(), zeroValue); - auto zeroVec = cir::VecCreateOp::create(builder, loc, vecTy, elements); + mlir::Type vecTy = cgf.convertType(e->getType()); + mlir::Value zeroVec = builder.getNullValue(vecTy, loc); mlir::Value lhs = Visit(e->getLHS()); mlir::Value rhs = Visit(e->getRHS()); @@ -1333,10 +1331,8 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> { mlir::Value VisitBinLOr(const clang::BinaryOperator *e) { if (e->getType()->isVectorType()) { mlir::Location loc = cgf.getLoc(e->getExprLoc()); - auto vecTy = mlir::cast<cir::VectorType>(cgf.convertType(e->getType())); - mlir::Value zeroValue = builder.getNullValue(vecTy.getElementType(), loc); - SmallVector<mlir::Value, 16> elements(vecTy.getSize(), zeroValue); - auto zeroVec = cir::VecCreateOp::create(builder, loc, vecTy, elements); + mlir::Type vecTy = cgf.convertType(e->getType()); + mlir::Value zeroVec = builder.getNullValue(vecTy, loc); mlir::Value lhs = Visit(e->getLHS()); mlir::Value rhs = Visit(e->getRHS()); diff --git a/clang/test/CIR/CodeGen/vector-ext.cpp b/clang/test/CIR/CodeGen/vector-ext.cpp index 2fd493f87c1ee..4d04d4f2f3311 100644 --- a/clang/test/CIR/CodeGen/vector-ext.cpp +++ b/clang/test/CIR/CodeGen/vector-ext.cpp @@ -1178,7 +1178,7 @@ void foo21() { // OGCG: %[[SIZE:.*]] = alloca i64, align 8 // OGCG: store i64 4, ptr %[[SIZE]], align 8 -void foo22() { +void logical_or_vi4() { vi4 a; vi4 b; vi4 c = a || b; @@ -1187,7 +1187,7 @@ void foo22() { // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"] // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"] // CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init] -// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.const_vector<[#cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i> +// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.zero : !cir.vector<4 x !s32i> // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> // CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> // CIR: %[[NE_A_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i> @@ -1257,7 +1257,7 @@ void foo24() { // OGCG: %[[RESULT_VF16:.*]] = fptrunc <4 x float> %[[RESULT]] to <4 x half> // OGCG: store <4 x half> %[[RESULT_VF16]], ptr %[[C_ADDR]], align 8 -void foo23() { +void logical_and_vi4() { vi4 a; vi4 b; vi4 c = a && b; @@ -1266,7 +1266,7 @@ void foo23() { // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"] // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"] // CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init] -// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.const_vector<[#cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i> +// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.zero : !cir.vector<4 x !s32i> // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> // CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> // CIR: %[[NE_A_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i> diff --git a/clang/test/CIR/CodeGen/vector.cpp b/clang/test/CIR/CodeGen/vector.cpp index 86551d277fa71..686af2db41b71 100644 --- a/clang/test/CIR/CodeGen/vector.cpp +++ b/clang/test/CIR/CodeGen/vector.cpp @@ -1220,7 +1220,7 @@ void foo24() { // OGCG: %[[SIZE:.*]] = alloca i64, align 8 // OGCG: store i64 4, ptr %[[SIZE]], align 8 -void foo25() { +void logical_or_vi4() { vi4 a; vi4 b; vi4 c = a || b; @@ -1229,7 +1229,7 @@ void foo25() { // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"] // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"] // CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init] -// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.const_vector<[#cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i> +// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.zero : !cir.vector<4 x !s32i> // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> // CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> // CIR: %[[NE_A_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i> @@ -1299,7 +1299,7 @@ void foo27() { // OGCG: %[[RESULT_VF16:.*]] = fptrunc <4 x float> %[[RESULT]] to <4 x half> // OGCG: store <4 x half> %[[RESULT_VF16]], ptr %[[C_ADDR]], align 8 -void foo26() { +void logical_and_vi4() { vi4 a; vi4 b; vi4 c = a && b; @@ -1308,7 +1308,7 @@ void foo26() { // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["a"] // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["b"] // CIR: %[[C_ADDR:.*]] = cir.alloca !cir.vector<4 x !s32i>, !cir.ptr<!cir.vector<4 x !s32i>>, ["c", init] -// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.const_vector<[#cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i, #cir.int<0> : !s32i]> : !cir.vector<4 x !s32i> +// CIR: %[[ZERO_VEC:.*]] = cir.const #cir.zero : !cir.vector<4 x !s32i> // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> // CIR: %[[TMP_B:.*]] = cir.load{{.*}} %[[B_ADDR]] : !cir.ptr<!cir.vector<4 x !s32i>>, !cir.vector<4 x !s32i> // CIR: %[[NE_A_ZERO:.*]] = cir.vec.cmp(ne, %[[TMP_A]], %[[ZERO_VEC]]) : !cir.vector<4 x !s32i>, !cir.vector<4 x !s32i> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
