llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clangir Author: Kunal Dubey (xakep8) <details> <summary>Changes</summary> 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 --- Full diff: https://github.com/llvm/llvm-project/pull/224204.diff 3 Files Affected: - (modified) clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp (+9-1) - (added) clang/test/CIR/CodeGenBuiltins/builtin-reduce-arithmetic.c (+49) - (modified) clang/test/CIR/CodeGenBuiltins/builtin-undef-rvalue.cpp (+5-5) ``````````diff diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index 61cb04828e272..ee324aafa9dde 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -2083,9 +2083,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 dac0ddf366334..d5a5025013a38 100644 --- a/clang/test/CIR/CodeGenBuiltins/builtin-undef-rvalue.cpp +++ b/clang/test/CIR/CodeGenBuiltins/builtin-undef-rvalue.cpp @@ -5,15 +5,15 @@ 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 -// LLVM-LABEL: @_Z36test_builtin_reduce_add_undef_rvalueDv4_i +// LLVM-LABEL: @_Z36test_builtin_reduce_max_undef_rvalueDv4_i // LLVM: store i32 undef, ptr %{{.+}}, align 4 // LLVM: ret i32 %{{.+}} `````````` </details> https://github.com/llvm/llvm-project/pull/224204 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
