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

Sabona Abdi via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 18 00:10:19 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
----------------
sabonaoabdi wrote:

I added the new case (#210493) but the slli/srli pair persisted. I traced it further and added cases for the following nodes: `RISCVISD::VMV_X_S`, `RISCVISD::VMV_S_X_VL`, `RISCVISD::VZEXT_VL`, `RISCVISD::VWADDU_VL`, and `RISCVISD::SUB_VL`. This removed the slli/srli pair across the file, and additionally dropped a pre-existing `andi a0, a0, 1023` instruction fin some of the 4 element cases (e.g. line 94). It turned out to be redudant due to vmv.x.s's sign extension guarantee. 

It's a much bigger change than the original case. Let me know if I split it into separate issues/PRs or other ways this should be scoped.

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


More information about the llvm-commits mailing list