[llvm] [SelectionDAG] Add computeKnownBits support for ISD::VECREDUCE_ADD (PR #207631)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 13 01:18:39 PDT 2026


================
@@ -73,29 +103,61 @@ entry:
 }
 
 define signext i16 @sad_16x8_as_i16(<16 x i8> %a, <16 x i8> %b) {
-; CHECK-LABEL: sad_16x8_as_i16:
-; CHECK:       # %bb.0: # %entry
-; CHECK-NEXT:    vsetivli zero, 16, e16, m1, ta, ma
-; CHECK-NEXT:    vmv.s.x v10, zero
-; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
-; CHECK-NEXT:    vminu.vv v11, v8, v9
-; CHECK-NEXT:    vmaxu.vv v8, v8, v9
-; CHECK-NEXT:    vsub.vv v8, v8, v11
-; CHECK-NEXT:    vwredsumu.vs v8, v8, v10
-; CHECK-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
-; CHECK-NEXT:    vmv.x.s a0, v8
-; CHECK-NEXT:    ret
+; RV32-LABEL: sad_16x8_as_i16:
+; RV32:       # %bb.0: # %entry
+; RV32-NEXT:    vsetivli zero, 16, e16, m1, ta, ma
+; RV32-NEXT:    vmv.s.x v10, zero
+; RV32-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
+; RV32-NEXT:    vminu.vv v11, v8, v9
+; RV32-NEXT:    vmaxu.vv v8, v8, v9
+; RV32-NEXT:    vsub.vv v8, v8, v11
+; RV32-NEXT:    vwredsumu.vs v8, v8, v10
+; RV32-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
+; RV32-NEXT:    vmv.x.s a0, v8
+; RV32-NEXT:    slli a0, a0, 20
+; RV32-NEXT:    srli a0, a0, 20
+; RV32-NEXT:    ret
 ;
-; ZVABD-LABEL: sad_16x8_as_i16:
-; ZVABD:       # %bb.0: # %entry
-; ZVABD-NEXT:    vsetivli zero, 16, e16, m1, ta, ma
-; ZVABD-NEXT:    vmv.s.x v10, zero
-; ZVABD-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
-; ZVABD-NEXT:    vabdu.vv v8, v8, v9
-; ZVABD-NEXT:    vwredsumu.vs v8, v8, v10
-; ZVABD-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
-; ZVABD-NEXT:    vmv.x.s a0, v8
-; ZVABD-NEXT:    ret
+; RV64-LABEL: sad_16x8_as_i16:
+; RV64:       # %bb.0: # %entry
+; RV64-NEXT:    vsetivli zero, 16, e16, m1, ta, ma
+; RV64-NEXT:    vmv.s.x v10, zero
+; RV64-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
+; RV64-NEXT:    vminu.vv v11, v8, v9
+; RV64-NEXT:    vmaxu.vv v8, v8, v9
+; RV64-NEXT:    vsub.vv v8, v8, v11
+; RV64-NEXT:    vwredsumu.vs v8, v8, v10
+; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
+; RV64-NEXT:    vmv.x.s a0, v8
+; RV64-NEXT:    slli a0, a0, 52
+; RV64-NEXT:    srli a0, a0, 52
+; RV64-NEXT:    ret
+;
+; RV32ZVABD-LABEL: sad_16x8_as_i16:
+; RV32ZVABD:       # %bb.0: # %entry
+; RV32ZVABD-NEXT:    vsetivli zero, 16, e16, m1, ta, ma
+; RV32ZVABD-NEXT:    vmv.s.x v10, zero
+; RV32ZVABD-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
+; RV32ZVABD-NEXT:    vabdu.vv v8, v8, v9
+; RV32ZVABD-NEXT:    vwredsumu.vs v8, v8, v10
+; RV32ZVABD-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
+; RV32ZVABD-NEXT:    vmv.x.s a0, v8
+; RV32ZVABD-NEXT:    slli a0, a0, 20
+; RV32ZVABD-NEXT:    srli a0, a0, 20
+; RV32ZVABD-NEXT:    ret
+;
+; RV64ZVABD-LABEL: sad_16x8_as_i16:
+; RV64ZVABD:       # %bb.0: # %entry
+; RV64ZVABD-NEXT:    vsetivli zero, 16, e16, m1, ta, ma
+; RV64ZVABD-NEXT:    vmv.s.x v10, zero
+; RV64ZVABD-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
+; RV64ZVABD-NEXT:    vabdu.vv v8, v8, v9
+; RV64ZVABD-NEXT:    vwredsumu.vs v8, v8, v10
+; RV64ZVABD-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
+; RV64ZVABD-NEXT:    vmv.x.s a0, v8
+; RV64ZVABD-NEXT:    slli a0, a0, 52
+; RV64ZVABD-NEXT:    srli a0, a0, 52
----------------
RKSimon wrote:

You're going to have to take a look at RISCVISD::VECREDUCE_ADD_VL first - yak shaving is a foundation skill for llvm - I try to only tag GFIs that avoid it, but you never know where they will appear from :)

https://github.com/llvm/llvm-project/pull/207631


More information about the llvm-commits mailing list