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

Reply via email to