llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clangir @llvm/pr-subscribers-clang Author: Amr Hesham (AmrDeveloper) <details> <summary>Changes</summary> Support the Vector of bool type in Not operation --- Full diff: https://github.com/llvm/llvm-project/pull/217012.diff 3 Files Affected: - (modified) clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td (+1-1) - (modified) clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp (+13-2) - (modified) clang/test/CIR/CodeGen/vector-bool.cpp (+19) ``````````diff diff --git a/clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td b/clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td index 0975e25a15ad0..29e5fee729717 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td +++ b/clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td @@ -363,7 +363,7 @@ def CIR_AnyFloatOrVecOfFloatType // Types valid for bitwise ops (and/or/xor): // integer, boolean, or vector of integer (no floating-point). def CIR_AnyBitwiseType - : AnyTypeOf<[CIR_AnyIntType, CIR_AnyBoolType, CIR_VectorOfIntType], + : AnyTypeOf<[CIR_AnyIntType, CIR_AnyBoolType, CIR_VectorOfIntOrBoolType], "integer, boolean, or vector of integer">; //===----------------------------------------------------------------------===// diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 28d265f70616d..578b328b622ee 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -3243,7 +3243,7 @@ mlir::LogicalResult CIRToLLVMNotOpLowering::matchAndRewrite( mlir::Value minusOne; if (isVector) { const uint64_t numElements = - mlir::dyn_cast<cir::VectorType>(op.getType()).getSize(); + mlir::cast<cir::VectorType>(op.getType()).getSize(); SmallVector<int32_t> values(numElements, -1); mlir::DenseIntElementsAttr denseVec = rewriter.getI32VectorAttr(values); minusOne = @@ -3255,11 +3255,22 @@ mlir::LogicalResult CIRToLLVMNotOpLowering::matchAndRewrite( minusOne); return mlir::success(); } + if (mlir::isa<cir::BoolType>(elementType)) { - auto one = mlir::LLVM::ConstantOp::create(rewriter, loc, llvmType, 1); + mlir::Value one; + if (isVector) { + const uint64_t numElements = + mlir::cast<cir::VectorType>(op.getType()).getSize(); + SmallVector<bool> values(numElements, true); + mlir::DenseIntElementsAttr denseVec = rewriter.getBoolVectorAttr(values); + one = mlir::LLVM::ConstantOp::create(rewriter, loc, llvmType, denseVec); + } else { + one = mlir::LLVM::ConstantOp::create(rewriter, loc, llvmType, 1); + } rewriter.replaceOpWithNewOp<mlir::LLVM::XOrOp>(op, adaptor.getInput(), one); return mlir::success(); } + return op.emitError() << "Unsupported type for bitwise NOT"; } diff --git a/clang/test/CIR/CodeGen/vector-bool.cpp b/clang/test/CIR/CodeGen/vector-bool.cpp index 91fa366c0872e..e34ca3a573043 100644 --- a/clang/test/CIR/CodeGen/vector-bool.cpp +++ b/clang/test/CIR/CodeGen/vector-bool.cpp @@ -180,3 +180,22 @@ void vec_bool_ternary_expr() { // SHARED: %[[RESULT:.*]] = select <8 x i1> %[[TMP_A_I8]], <8 x i1> %[[TMP_B_I8]], <8 x i1> %[[TMP_C_I8]] // SHARED: %[[RESULT_I8:.*]] = bitcast <8 x i1> %[[RESULT]] to i8 // SHARED: store i8 %[[RESULT_I8]], ptr %[[D_ADDR]], align 1 + +void vec_bool_not_op() { + v8b a; + v8b b = ~a; +} + +// CIR: %[[A_ADDR:.*]] = cir.alloca "a" {{.*}} : !cir.ptr<!cir.vector<8 x !cir.bool>> +// CIR: %[[B_ADDR:.*]] = cir.alloca "b" {{.*}} init : !cir.ptr<!cir.vector<8 x !cir.bool>> +// CIR: %[[TMP_A:.*]] = cir.load {{.*}} %[[A_ADDR]] : !cir.ptr<!cir.vector<8 x !cir.bool>>, !cir.vector<8 x !cir.bool> +// CIR: %[[RESULT:.*]] = cir.not %[[TMP_A]] : !cir.vector<8 x !cir.bool> +// CIR: cir.store {{.*}} %[[RESULT]], %[[B_ADDR]] : !cir.vector<8 x !cir.bool>, !cir.ptr<!cir.vector<8 x !cir.bool>> + +// SHARED: %[[A_ADDR:.*]] = alloca i8, align 1 +// SHARED: %[[B_ADDR:.*]] = alloca i8, align 1 +// SHARED: %[[TMP_A:.*]] = load i8, ptr %[[A_ADDR]], align 1 +// SHARED: %[[TMP_A_VEC:.*]] = bitcast i8 %[[TMP_A:.*]] to <8 x i1> +// SHARED: %[[RESULT:.*]] = xor <8 x i1> %[[TMP_A_VEC]], splat (i1 true) +// SHARED: %[[RESULT_I8:.*]] = bitcast <8 x i1> %[[RESULT]] to i8 +// SHARED: store i8 %[[RESULT_I8]], ptr %[[B_ADDR]], align 1 `````````` </details> https://github.com/llvm/llvm-project/pull/217012 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
