[llvm] [SelectionDAG] Fold VECREDUCE_AND/OR/XOR of a constant BUILD_VECTOR (PR #210883)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 21 03:20:26 PDT 2026


https://github.com/RKSimon updated https://github.com/llvm/llvm-project/pull/210883

>From 2b9b0b3692164f9a22bd68ca2a0e249fc3a582fa Mon Sep 17 00:00:00 2001
From: Ankit Kumar Tiwari <ankit.cybertron at gmail.com>
Date: Tue, 21 Jul 2026 06:48:30 +0530
Subject: [PATCH 1/3] Base test for RISCV

---
 .../RISCV/rvv/vecreduce-and-constant-fold.ll  |  71 +++++++++
 .../rvv/vecreduce-orxor-constant-fold.ll      | 145 ++++++++++++++++++
 2 files changed, 216 insertions(+)
 create mode 100644 llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
 create mode 100644 llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll

diff --git a/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll b/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
new file mode 100644
index 0000000000000..1a914108ef559
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
@@ -0,0 +1,71 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
+
+define i32 @test_and_const() {
+; CHECK-LABEL: test_and_const:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lui a0, 12401
+; CHECK-NEXT:    addi a0, a0, -1
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vmv.s.x v8, a0
+; CHECK-NEXT:    vsext.vf4 v9, v8
+; CHECK-NEXT:    vredand.vs v8, v9, v9
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> <i32 -1, i32 15, i32 7, i32 3>)
+  ret i32 %r
+}
+
+define i32 @test_and_const_wide() {
+; CHECK-LABEL: test_and_const_wide:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
+; CHECK-NEXT:    vmv.v.i v8, 10
+; CHECK-NEXT:    vid.v v10
+; CHECK-NEXT:    li a0, 10
+; CHECK-NEXT:    vmadd.vx v10, a0, v8
+; CHECK-NEXT:    vredand.vs v8, v10, v10
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> <i32 10, i32 20, i32 30, i32 40, i32 50, i32 60, i32 70, i32 80>)
+  ret i32 %r
+}
+
+define i32 @test_and_nonconst(<4 x i32> %v) {
+; CHECK-LABEL: test_and_nonconst:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vredand.vs v8, v8, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %v)
+  ret i32 %r
+}
+
+define i32 @test_and_poison() {
+; CHECK-LABEL: test_and_poison:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lui a0, %hi(.LCPI3_0)
+; CHECK-NEXT:    addi a0, a0, %lo(.LCPI3_0)
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vle32.v v8, (a0)
+; CHECK-NEXT:    vredand.vs v8, v8, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> <i32 -1, i32 15, i32 poison, i32 3>)
+  ret i32 %r
+}
+
+define i32 @test_and_undef() {
+; CHECK-LABEL: test_and_undef:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lui a0, %hi(.LCPI4_0)
+; CHECK-NEXT:    addi a0, a0, %lo(.LCPI4_0)
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vle32.v v8, (a0)
+; CHECK-NEXT:    vredand.vs v8, v8, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> <i32 -1, i32 15, i32 undef, i32 3>)
+  ret i32 %r
+}
diff --git a/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll b/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll
new file mode 100644
index 0000000000000..da49833924120
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll
@@ -0,0 +1,145 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
+
+define i32 @test_or_const() {
+; CHECK-LABEL: test_or_const:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lui a0, 32848
+; CHECK-NEXT:    addi a0, a0, -511
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vmv.s.x v8, a0
+; CHECK-NEXT:    vsext.vf4 v9, v8
+; CHECK-NEXT:    vredor.vs v8, v9, v9
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 -2, i32 4, i32 8>)
+  ret i32 %r
+}
+
+define i32 @test_or_const_wide() {
+; CHECK-LABEL: test_or_const_wide:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
+; CHECK-NEXT:    vmv.v.i v8, 10
+; CHECK-NEXT:    vid.v v10
+; CHECK-NEXT:    li a0, 10
+; CHECK-NEXT:    vmadd.vx v10, a0, v8
+; CHECK-NEXT:    vredor.vs v8, v10, v10
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 10, i32 20, i32 30, i32 40, i32 50, i32 60, i32 70, i32 80>)
+  ret i32 %r
+}
+
+define i32 @test_or_nonconst(<4 x i32> %v) {
+; CHECK-LABEL: test_or_nonconst:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vredor.vs v8, v8, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %v)
+  ret i32 %r
+}
+
+define i32 @test_or_poison() {
+; CHECK-LABEL: test_or_poison:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lui a0, %hi(.LCPI3_0)
+; CHECK-NEXT:    addi a0, a0, %lo(.LCPI3_0)
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vle32.v v8, (a0)
+; CHECK-NEXT:    vredor.vs v8, v8, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 -2, i32 poison, i32 8>)
+  ret i32 %r
+}
+
+define i32 @test_or_undef() {
+; CHECK-LABEL: test_or_undef:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lui a0, %hi(.LCPI4_0)
+; CHECK-NEXT:    addi a0, a0, %lo(.LCPI4_0)
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vle32.v v8, (a0)
+; CHECK-NEXT:    vredor.vs v8, v8, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 2, i32 undef, i32 -8>)
+  ret i32 %r
+}
+
+define i32 @test_xor_const() {
+; CHECK-LABEL: test_xor_const:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vmv.s.x v8, zero
+; CHECK-NEXT:    lui a0, 32848
+; CHECK-NEXT:    addi a0, a0, -511
+; CHECK-NEXT:    vmv.s.x v9, a0
+; CHECK-NEXT:    vsext.vf4 v10, v9
+; CHECK-NEXT:    vredxor.vs v8, v10, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> <i32 1, i32 -2, i32 4, i32 8>)
+  ret i32 %r
+}
+
+define i32 @test_xor_const_wide() {
+; CHECK-LABEL: test_xor_const_wide:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
+; CHECK-NEXT:    vmv.v.i v8, 10
+; CHECK-NEXT:    vid.v v10
+; CHECK-NEXT:    li a0, 10
+; CHECK-NEXT:    vmadd.vx v10, a0, v8
+; CHECK-NEXT:    vmv.s.x v8, zero
+; CHECK-NEXT:    vredxor.vs v8, v10, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> <i32 10, i32 20, i32 30, i32 40, i32 50, i32 60, i32 70, i32 80>)
+  ret i32 %r
+}
+
+define i32 @test_xor_nonconst(<4 x i32> %v) {
+; CHECK-LABEL: test_xor_nonconst:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vmv.s.x v9, zero
+; CHECK-NEXT:    vredxor.vs v8, v8, v9
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %v)
+  ret i32 %r
+}
+
+define i32 @test_xor_poison() {
+; CHECK-LABEL: test_xor_poison:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vmv.s.x v8, zero
+; CHECK-NEXT:    lui a0, %hi(.LCPI8_0)
+; CHECK-NEXT:    addi a0, a0, %lo(.LCPI8_0)
+; CHECK-NEXT:    vle32.v v9, (a0)
+; CHECK-NEXT:    vredxor.vs v8, v9, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> <i32 1, i32 -2, i32 poison, i32 8>)
+  ret i32 %r
+}
+
+define i32 @test_xor_undef() {
+; CHECK-LABEL: test_xor_undef:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vmv.s.x v8, zero
+; CHECK-NEXT:    lui a0, %hi(.LCPI9_0)
+; CHECK-NEXT:    addi a0, a0, %lo(.LCPI9_0)
+; CHECK-NEXT:    vle32.v v9, (a0)
+; CHECK-NEXT:    vredxor.vs v8, v9, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> <i32 1, i32 2, i32 undef, i32 -8>)
+  ret i32 %r
+}

>From 323c221c6fa7b565b880ce705508e74058c05a04 Mon Sep 17 00:00:00 2001
From: Ankit Kumar Tiwari <ankit.cybertron at gmail.com>
Date: Tue, 21 Jul 2026 11:20:26 +0530
Subject: [PATCH 2/3] Add constant folding for VECREDUCE_AND/OR/XOR

---
 .../lib/CodeGen/SelectionDAG/SelectionDAG.cpp |  7 ++-
 .../RISCV/rvv/vecreduce-and-constant-fold.ll  | 22 +--------
 .../rvv/vecreduce-orxor-constant-fold.ll      | 47 ++-----------------
 3 files changed, 12 insertions(+), 64 deletions(-)

diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 42345c18806d9..862ed8e1dee99 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -7141,6 +7141,9 @@ SDValue SelectionDAG::getNode(unsigned Opcode, const SDLoc &DL, EVT VT,
   case ISD::VECREDUCE_UMAX:
   case ISD::VECREDUCE_UMIN:
   case ISD::VECREDUCE_MUL:
+  case ISD::VECREDUCE_AND:
+  case ISD::VECREDUCE_OR:
+  case ISD::VECREDUCE_XOR:
   case ISD::STEP_VECTOR: {
     SDValue Ops = {N1};
     if (SDValue Fold = FoldConstantArithmetic(Opcode, DL, VT, Ops))
@@ -7837,7 +7840,9 @@ SDValue SelectionDAG::FoldConstantArithmetic(unsigned Opcode, const SDLoc &DL,
     // Constant fold integer vector reductions with constant BUILD_VECTORs.
     if ((Opcode == ISD::VECREDUCE_ADD || Opcode == ISD::VECREDUCE_SMAX ||
          Opcode == ISD::VECREDUCE_SMIN || Opcode == ISD::VECREDUCE_UMAX ||
-         Opcode == ISD::VECREDUCE_UMIN || Opcode == ISD::VECREDUCE_MUL) &&
+         Opcode == ISD::VECREDUCE_UMIN || Opcode == ISD::VECREDUCE_MUL ||
+         Opcode == ISD::VECREDUCE_OR || Opcode == ISD::VECREDUCE_XOR ||
+         Opcode == ISD::VECREDUCE_AND) &&
         ISD::isBuildVectorOfConstantSDNodes(N1.getNode())) {
       unsigned EltBits = N1.getValueType().getScalarSizeInBits();
       unsigned BaseOpcode = ISD::getVecReduceBaseOpcode(Opcode);
diff --git a/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll b/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
index 1a914108ef559..3947b1494e5c6 100644
--- a/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
@@ -4,13 +4,7 @@
 define i32 @test_and_const() {
 ; CHECK-LABEL: test_and_const:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lui a0, 12401
-; CHECK-NEXT:    addi a0, a0, -1
-; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
-; CHECK-NEXT:    vmv.s.x v8, a0
-; CHECK-NEXT:    vsext.vf4 v9, v8
-; CHECK-NEXT:    vredand.vs v8, v9, v9
-; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    li a0, 3
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> <i32 -1, i32 15, i32 7, i32 3>)
   ret i32 %r
@@ -19,13 +13,7 @@ define i32 @test_and_const() {
 define i32 @test_and_const_wide() {
 ; CHECK-LABEL: test_and_const_wide:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
-; CHECK-NEXT:    vmv.v.i v8, 10
-; CHECK-NEXT:    vid.v v10
-; CHECK-NEXT:    li a0, 10
-; CHECK-NEXT:    vmadd.vx v10, a0, v8
-; CHECK-NEXT:    vredand.vs v8, v10, v10
-; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    li a0, 0
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.and.v8i32(<8 x i32> <i32 10, i32 20, i32 30, i32 40, i32 50, i32 60, i32 70, i32 80>)
   ret i32 %r
@@ -45,12 +33,6 @@ define i32 @test_and_nonconst(<4 x i32> %v) {
 define i32 @test_and_poison() {
 ; CHECK-LABEL: test_and_poison:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lui a0, %hi(.LCPI3_0)
-; CHECK-NEXT:    addi a0, a0, %lo(.LCPI3_0)
-; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
-; CHECK-NEXT:    vle32.v v8, (a0)
-; CHECK-NEXT:    vredand.vs v8, v8, v8
-; CHECK-NEXT:    vmv.x.s a0, v8
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> <i32 -1, i32 15, i32 poison, i32 3>)
   ret i32 %r
diff --git a/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll b/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll
index da49833924120..b2a5268674edb 100644
--- a/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll
@@ -4,13 +4,7 @@
 define i32 @test_or_const() {
 ; CHECK-LABEL: test_or_const:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lui a0, 32848
-; CHECK-NEXT:    addi a0, a0, -511
-; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
-; CHECK-NEXT:    vmv.s.x v8, a0
-; CHECK-NEXT:    vsext.vf4 v9, v8
-; CHECK-NEXT:    vredor.vs v8, v9, v9
-; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    li a0, -1
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 -2, i32 4, i32 8>)
   ret i32 %r
@@ -19,13 +13,7 @@ define i32 @test_or_const() {
 define i32 @test_or_const_wide() {
 ; CHECK-LABEL: test_or_const_wide:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
-; CHECK-NEXT:    vmv.v.i v8, 10
-; CHECK-NEXT:    vid.v v10
-; CHECK-NEXT:    li a0, 10
-; CHECK-NEXT:    vmadd.vx v10, a0, v8
-; CHECK-NEXT:    vredor.vs v8, v10, v10
-; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    li a0, 126
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 10, i32 20, i32 30, i32 40, i32 50, i32 60, i32 70, i32 80>)
   ret i32 %r
@@ -45,12 +33,6 @@ define i32 @test_or_nonconst(<4 x i32> %v) {
 define i32 @test_or_poison() {
 ; CHECK-LABEL: test_or_poison:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    lui a0, %hi(.LCPI3_0)
-; CHECK-NEXT:    addi a0, a0, %lo(.LCPI3_0)
-; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
-; CHECK-NEXT:    vle32.v v8, (a0)
-; CHECK-NEXT:    vredor.vs v8, v8, v8
-; CHECK-NEXT:    vmv.x.s a0, v8
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 -2, i32 poison, i32 8>)
   ret i32 %r
@@ -73,14 +55,7 @@ define i32 @test_or_undef() {
 define i32 @test_xor_const() {
 ; CHECK-LABEL: test_xor_const:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
-; CHECK-NEXT:    vmv.s.x v8, zero
-; CHECK-NEXT:    lui a0, 32848
-; CHECK-NEXT:    addi a0, a0, -511
-; CHECK-NEXT:    vmv.s.x v9, a0
-; CHECK-NEXT:    vsext.vf4 v10, v9
-; CHECK-NEXT:    vredxor.vs v8, v10, v8
-; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    li a0, -13
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> <i32 1, i32 -2, i32 4, i32 8>)
   ret i32 %r
@@ -89,14 +64,7 @@ define i32 @test_xor_const() {
 define i32 @test_xor_const_wide() {
 ; CHECK-LABEL: test_xor_const_wide:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
-; CHECK-NEXT:    vmv.v.i v8, 10
-; CHECK-NEXT:    vid.v v10
-; CHECK-NEXT:    li a0, 10
-; CHECK-NEXT:    vmadd.vx v10, a0, v8
-; CHECK-NEXT:    vmv.s.x v8, zero
-; CHECK-NEXT:    vredxor.vs v8, v10, v8
-; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    li a0, 48
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.xor.v8i32(<8 x i32> <i32 10, i32 20, i32 30, i32 40, i32 50, i32 60, i32 70, i32 80>)
   ret i32 %r
@@ -117,13 +85,6 @@ define i32 @test_xor_nonconst(<4 x i32> %v) {
 define i32 @test_xor_poison() {
 ; CHECK-LABEL: test_xor_poison:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
-; CHECK-NEXT:    vmv.s.x v8, zero
-; CHECK-NEXT:    lui a0, %hi(.LCPI8_0)
-; CHECK-NEXT:    addi a0, a0, %lo(.LCPI8_0)
-; CHECK-NEXT:    vle32.v v9, (a0)
-; CHECK-NEXT:    vredxor.vs v8, v9, v8
-; CHECK-NEXT:    vmv.x.s a0, v8
 ; CHECK-NEXT:    ret
   %r = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> <i32 1, i32 -2, i32 poison, i32 8>)
   ret i32 %r

>From cbe8a7a0a7095c5e15ff64274fdd61fcd5322733 Mon Sep 17 00:00:00 2001
From: Ankit Kumar Tiwari <ankit.cybertron at gmail.com>
Date: Tue, 21 Jul 2026 14:07:50 +0530
Subject: [PATCH 3/3] Split OR and XOR Test && Remove -verify-machineinstrs
 option

---
 .../RISCV/rvv/vecreduce-and-constant-fold.ll  |  2 +-
 .../RISCV/rvv/vecreduce-or-constant-fold.ll   | 53 +++++++++++++++++
 ...fold.ll => vecreduce-xor-constant-fold.ll} | 57 +------------------
 3 files changed, 57 insertions(+), 55 deletions(-)
 create mode 100644 llvm/test/CodeGen/RISCV/rvv/vecreduce-or-constant-fold.ll
 rename llvm/test/CodeGen/RISCV/rvv/{vecreduce-orxor-constant-fold.ll => vecreduce-xor-constant-fold.ll} (51%)

diff --git a/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll b/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
index 3947b1494e5c6..a53165328bfad 100644
--- a/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/vecreduce-and-constant-fold.ll
@@ -1,5 +1,5 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
-; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
+; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s
 
 define i32 @test_and_const() {
 ; CHECK-LABEL: test_and_const:
diff --git a/llvm/test/CodeGen/RISCV/rvv/vecreduce-or-constant-fold.ll b/llvm/test/CodeGen/RISCV/rvv/vecreduce-or-constant-fold.ll
new file mode 100644
index 0000000000000..4b3114527534e
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/rvv/vecreduce-or-constant-fold.ll
@@ -0,0 +1,53 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s
+
+define i32 @test_or_const() {
+; CHECK-LABEL: test_or_const:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    li a0, -1
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 -2, i32 4, i32 8>)
+  ret i32 %r
+}
+
+define i32 @test_or_const_wide() {
+; CHECK-LABEL: test_or_const_wide:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    li a0, 126
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 10, i32 20, i32 30, i32 40, i32 50, i32 60, i32 70, i32 80>)
+  ret i32 %r
+}
+
+define i32 @test_or_nonconst(<4 x i32> %v) {
+; CHECK-LABEL: test_or_nonconst:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vredor.vs v8, v8, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %v)
+  ret i32 %r
+}
+
+define i32 @test_or_poison() {
+; CHECK-LABEL: test_or_poison:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 -2, i32 poison, i32 8>)
+  ret i32 %r
+}
+
+define i32 @test_or_undef() {
+; CHECK-LABEL: test_or_undef:
+; CHECK:       # %bb.0:
+; CHECK-NEXT:    lui a0, %hi(.LCPI4_0)
+; CHECK-NEXT:    addi a0, a0, %lo(.LCPI4_0)
+; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
+; CHECK-NEXT:    vle32.v v8, (a0)
+; CHECK-NEXT:    vredor.vs v8, v8, v8
+; CHECK-NEXT:    vmv.x.s a0, v8
+; CHECK-NEXT:    ret
+  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 2, i32 undef, i32 -8>)
+  ret i32 %r
+}
diff --git a/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll b/llvm/test/CodeGen/RISCV/rvv/vecreduce-xor-constant-fold.ll
similarity index 51%
rename from llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll
rename to llvm/test/CodeGen/RISCV/rvv/vecreduce-xor-constant-fold.ll
index b2a5268674edb..79b6a463263cf 100644
--- a/llvm/test/CodeGen/RISCV/rvv/vecreduce-orxor-constant-fold.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/vecreduce-xor-constant-fold.ll
@@ -1,56 +1,5 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
-; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
-
-define i32 @test_or_const() {
-; CHECK-LABEL: test_or_const:
-; CHECK:       # %bb.0:
-; CHECK-NEXT:    li a0, -1
-; CHECK-NEXT:    ret
-  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 -2, i32 4, i32 8>)
-  ret i32 %r
-}
-
-define i32 @test_or_const_wide() {
-; CHECK-LABEL: test_or_const_wide:
-; CHECK:       # %bb.0:
-; CHECK-NEXT:    li a0, 126
-; CHECK-NEXT:    ret
-  %r = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> <i32 10, i32 20, i32 30, i32 40, i32 50, i32 60, i32 70, i32 80>)
-  ret i32 %r
-}
-
-define i32 @test_or_nonconst(<4 x i32> %v) {
-; CHECK-LABEL: test_or_nonconst:
-; CHECK:       # %bb.0:
-; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
-; CHECK-NEXT:    vredor.vs v8, v8, v8
-; CHECK-NEXT:    vmv.x.s a0, v8
-; CHECK-NEXT:    ret
-  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %v)
-  ret i32 %r
-}
-
-define i32 @test_or_poison() {
-; CHECK-LABEL: test_or_poison:
-; CHECK:       # %bb.0:
-; CHECK-NEXT:    ret
-  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 -2, i32 poison, i32 8>)
-  ret i32 %r
-}
-
-define i32 @test_or_undef() {
-; CHECK-LABEL: test_or_undef:
-; CHECK:       # %bb.0:
-; CHECK-NEXT:    lui a0, %hi(.LCPI4_0)
-; CHECK-NEXT:    addi a0, a0, %lo(.LCPI4_0)
-; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
-; CHECK-NEXT:    vle32.v v8, (a0)
-; CHECK-NEXT:    vredor.vs v8, v8, v8
-; CHECK-NEXT:    vmv.x.s a0, v8
-; CHECK-NEXT:    ret
-  %r = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> <i32 1, i32 2, i32 undef, i32 -8>)
-  ret i32 %r
-}
+; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s
 
 define i32 @test_xor_const() {
 ; CHECK-LABEL: test_xor_const:
@@ -95,8 +44,8 @@ define i32 @test_xor_undef() {
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
 ; CHECK-NEXT:    vmv.s.x v8, zero
-; CHECK-NEXT:    lui a0, %hi(.LCPI9_0)
-; CHECK-NEXT:    addi a0, a0, %lo(.LCPI9_0)
+; CHECK-NEXT:    lui a0, %hi(.LCPI4_0)
+; CHECK-NEXT:    addi a0, a0, %lo(.LCPI4_0)
 ; CHECK-NEXT:    vle32.v v9, (a0)
 ; CHECK-NEXT:    vredxor.vs v8, v9, v8
 ; CHECK-NEXT:    vmv.x.s a0, v8



More information about the llvm-commits mailing list