https://github.com/xakep8 updated https://github.com/llvm/llvm-project/pull/224204
>From 422867a172ef2fbf49ef601ae0c2435720eb303f Mon Sep 17 00:00:00 2001 From: Kunal Dubey <[email protected]> Date: Thu, 17 Sep 2026 12:17:03 +0530 Subject: [PATCH] [CIR] Lowering for __builtin_reduce_add/mul Added lowering for __builtin_reduce_add and __builtin_reduce_mul by mimicking the same shape as __builtin_reduce_xor which mirrors classic Codegen shape Added test for the same --- clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp | 10 +++- .../builtin-reduce-arithmetic.c | 49 +++++++++++++++++++ .../CodeGenBuiltins/builtin-undef-rvalue.cpp | 8 +-- 3 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 clang/test/CIR/CodeGenBuiltins/builtin-reduce-arithmetic.c diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index e2fe3adefd4af..b0e3f0ae00ebe 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -2141,9 +2141,17 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID, case Builtin::BI__builtin_elementwise_minimumnum: case Builtin::BI__builtin_reduce_max: case Builtin::BI__builtin_reduce_min: + return errorBuiltinNYI(*this, e, builtinID); case Builtin::BI__builtin_reduce_add: + return emitBuiltinWithOneOverloadedType<1>( + e, "vector.reduce.add", + cast<cir::VectorType>(convertType(e->getArg(0)->getType())) + .getElementType()); case Builtin::BI__builtin_reduce_mul: - return errorBuiltinNYI(*this, e, builtinID); + return emitBuiltinWithOneOverloadedType<1>( + e, "vector.reduce.mul", + cast<cir::VectorType>(convertType(e->getArg(0)->getType())) + .getElementType()); case Builtin::BI__builtin_reduce_xor: return emitBuiltinWithOneOverloadedType<1>( e, "vector.reduce.xor", diff --git a/clang/test/CIR/CodeGenBuiltins/builtin-reduce-arithmetic.c b/clang/test/CIR/CodeGenBuiltins/builtin-reduce-arithmetic.c new file mode 100644 index 0000000000000..271aaecf5e0a8 --- /dev/null +++ b/clang/test/CIR/CodeGenBuiltins/builtin-reduce-arithmetic.c @@ -0,0 +1,49 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir +// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll +// RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll +// RUN: FileCheck --check-prefix=LLVM --input-file=%t.ll %s + +typedef int v4si __attribute__((vector_size(16))); +typedef unsigned int v4su __attribute__((vector_size(16))); + +int test_reduce_add(v4si x) { + // CIR-LABEL: @test_reduce_add + // CIR: cir.call_llvm_intrinsic "vector.reduce.add" + // CIR: cir.return + // LLVM-LABEL: @test_reduce_add + // LLVM: call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> + // LLVM: ret i32 + return __builtin_reduce_add(x); +} + +unsigned test_reduce_add_unsigned(v4su x) { + // CIR-LABEL: @test_reduce_add_unsigned + // CIR: cir.call_llvm_intrinsic "vector.reduce.add" + // CIR: cir.return + // LLVM-LABEL: @test_reduce_add_unsigned + // LLVM: call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> + // LLVM: ret i32 + return __builtin_reduce_add(x); +} + +int test_reduce_mul(v4si x) { + // CIR-LABEL: @test_reduce_mul + // CIR: cir.call_llvm_intrinsic "vector.reduce.mul" + // CIR: cir.return + // LLVM-LABEL: @test_reduce_mul + // LLVM: call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> + // LLVM: ret i32 + return __builtin_reduce_mul(x); +} + +unsigned test_reduce_mul_unsigned(v4su x) { + // CIR-LABEL: @test_reduce_mul_unsigned + // CIR: cir.call_llvm_intrinsic "vector.reduce.mul" + // CIR: cir.return + // LLVM-LABEL: @test_reduce_mul_unsigned + // LLVM: call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> + // LLVM: ret i32 + return __builtin_reduce_mul(x); +} diff --git a/clang/test/CIR/CodeGenBuiltins/builtin-undef-rvalue.cpp b/clang/test/CIR/CodeGenBuiltins/builtin-undef-rvalue.cpp index c15375621f08a..372eb97c323f3 100644 --- a/clang/test/CIR/CodeGenBuiltins/builtin-undef-rvalue.cpp +++ b/clang/test/CIR/CodeGenBuiltins/builtin-undef-rvalue.cpp @@ -3,11 +3,11 @@ typedef int v4si __attribute__((vector_size(16))); -int test_builtin_reduce_add_undef_rvalue(v4si x) { - // expected-error@+1 {{unimplemented builtin call: __builtin_reduce_add}} - return __builtin_reduce_add(x); +int test_builtin_reduce_max_undef_rvalue(v4si x) { + // expected-error@+1 {{unimplemented builtin call: __builtin_reduce_max}} + return __builtin_reduce_max(x); } -// CIR-LABEL: @_Z36test_builtin_reduce_add_undef_rvalueDv4_i +// CIR-LABEL: @_Z36test_builtin_reduce_max_undef_rvalueDv4_i // CIR: cir.const #cir.undef : !s32i // CIR: cir.return _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
