[llvm] [SelectionDAG] Fold VECREDUCE_MUL of a constant BUILD_VECTOR (PR #210126)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 20 07:48:51 PDT 2026
================
@@ -0,0 +1,73 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=aarch64 -verify-machineinstrs < %s | FileCheck %s
+
+; all-constant vector -> should fold to a plain constant (24)
+define i32 @test_const() {
+; CHECK-LABEL: test_const:
+; CHECK: // %bb.0:
+; CHECK-NEXT: mov w0, #24 // =0x18
+; CHECK-NEXT: ret
+ %r = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> <i32 1, i32 2, i32 3, i32 4>)
+ ret i32 %r
+}
+
+; 8-element vector, product = 40320
+define i32 @test_const_wide() {
+; CHECK-LABEL: test_const_wide:
+; CHECK: // %bb.0:
+; CHECK-NEXT: mov w0, #40320 // =0x9d80
+; CHECK-NEXT: ret
+ %r = call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8>)
+ ret i32 %r
+}
+
+; non-constant input -> should NOT fold
+define i32 @test_nonconst(<4 x i32> %v) {
+; CHECK-LABEL: test_nonconst:
+; CHECK: // %bb.0:
+; CHECK-NEXT: mov d1, v0.d[1]
+; CHECK-NEXT: mul v0.2s, v0.2s, v1.2s
+; CHECK-NEXT: mul v0.2s, v0.2s, v0.s[1]
+; CHECK-NEXT: fmov w0, s0
+; CHECK-NEXT: ret
+ %r = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> %v)
+ ret i32 %r
+}
+
+; vector containing a poison element -> return poison
+define i32 @test_poison() {
+; CHECK-LABEL: test_poison:
+; CHECK: // %bb.0:
+; CHECK-NEXT: ret
+ %r = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> <i32 1, i32 2, i32 poison, i32 4>)
+ ret i32 %r
+}
+
+; vector containing zero and poison -> should NOT fold
+define i32 @test_zero_and_poison() {
+; CHECK-LABEL: test_zero_and_poison:
+; CHECK: // %bb.0:
+; CHECK-NEXT: ret
+ %r = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> <i32 0, i32 2, i32 poison, i32 4>)
+ ret i32 %r
+}
+
+; vector containing an undef element -> should NOT fold
+define i32 @test_undef() {
+; CHECK-LABEL: test_undef:
+; CHECK: // %bb.0:
+; CHECK-NEXT: mov w0, wzr
+; CHECK-NEXT: ret
+ %r = call i32 @llvm.vector.reduce.mul.v4i32(<4 x i32> <i32 1, i32 2, i32 undef, i32 4>)
+ ret i32 %r
+}
+
+; vector containing zero and undef -> should NOT fold
----------------
RKSimon wrote:
```suggestion
; vector containing an undef element -> leave constant fold to expansion
```
https://github.com/llvm/llvm-project/pull/210126
More information about the llvm-commits
mailing list