|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
|
2 |
| -; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zbb | FileCheck %s --check-prefixes=CHECK,RV32 |
3 |
| -; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zbb | FileCheck %s --check-prefixes=CHECK,RV64 |
| 2 | +; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zbb | FileCheck %s --check-prefixes=CHECK,V |
| 3 | +; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zbb | FileCheck %s --check-prefixes=CHECK,V |
| 4 | +; RUN: llc < %s -mtriple=riscv64 -mattr=+zve32x,+zvl128b,+zbb | FileCheck %s --check-prefixes=CHECK,ZVE |
4 | 5 |
|
5 | 6 | define i32 @test_v2i1(<2 x i1> %x) {
|
6 |
| -; CHECK-LABEL: test_v2i1: |
7 |
| -; CHECK: # %bb.0: |
8 |
| -; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma |
9 |
| -; CHECK-NEXT: vcpop.m a0, v0 |
10 |
| -; CHECK-NEXT: ret |
| 7 | +; V-LABEL: test_v2i1: |
| 8 | +; V: # %bb.0: |
| 9 | +; V-NEXT: vsetivli zero, 2, e8, mf8, ta, ma |
| 10 | +; V-NEXT: vcpop.m a0, v0 |
| 11 | +; V-NEXT: ret |
| 12 | +; |
| 13 | +; ZVE-LABEL: test_v2i1: |
| 14 | +; ZVE: # %bb.0: |
| 15 | +; ZVE-NEXT: vsetivli zero, 2, e8, mf4, ta, ma |
| 16 | +; ZVE-NEXT: vcpop.m a0, v0 |
| 17 | +; ZVE-NEXT: ret |
11 | 18 | %a = zext <2 x i1> %x to <2 x i32>
|
12 | 19 | %b = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %a)
|
13 | 20 | ret i32 %b
|
@@ -173,6 +180,35 @@ define i32 @test_v256i1(<256 x i1> %x) {
|
173 | 180 | ret i32 %b
|
174 | 181 | }
|
175 | 182 |
|
| 183 | +; FIXME: Optimize this case with Zve32x. We have to use mf4 and set the VL to |
| 184 | +; VLEN/64. |
| 185 | +define i32 @test_nxv1i1(<vscale x 1 x i1> %x) { |
| 186 | +; V-LABEL: test_nxv1i1: |
| 187 | +; V: # %bb.0: # %entry |
| 188 | +; V-NEXT: vsetvli a0, zero, e8, mf8, ta, ma |
| 189 | +; V-NEXT: vcpop.m a0, v0 |
| 190 | +; V-NEXT: ret |
| 191 | +; |
| 192 | +; ZVE-LABEL: test_nxv1i1: |
| 193 | +; ZVE: # %bb.0: # %entry |
| 194 | +; ZVE-NEXT: vsetvli a0, zero, e32, m1, ta, ma |
| 195 | +; ZVE-NEXT: vmv.v.i v8, 0 |
| 196 | +; ZVE-NEXT: csrr a0, vlenb |
| 197 | +; ZVE-NEXT: srli a0, a0, 3 |
| 198 | +; ZVE-NEXT: vsetvli zero, a0, e32, m1, ta, ma |
| 199 | +; ZVE-NEXT: vmerge.vim v8, v8, 1, v0 |
| 200 | +; ZVE-NEXT: vsetivli zero, 1, e32, m1, ta, ma |
| 201 | +; ZVE-NEXT: vmv.s.x v9, zero |
| 202 | +; ZVE-NEXT: vsetvli zero, a0, e32, m1, ta, ma |
| 203 | +; ZVE-NEXT: vredsum.vs v9, v8, v9 |
| 204 | +; ZVE-NEXT: vmv.x.s a0, v9 |
| 205 | +; ZVE-NEXT: ret |
| 206 | +entry: |
| 207 | + %a = zext <vscale x 1 x i1> %x to <vscale x 1 x i32> |
| 208 | + %b = call i32 @llvm.vector.reduce.add.nxv1i32(<vscale x 1 x i32> %a) |
| 209 | + ret i32 %b |
| 210 | +} |
| 211 | + |
176 | 212 | define i32 @test_nxv2i1(<vscale x 2 x i1> %x) {
|
177 | 213 | ; CHECK-LABEL: test_nxv2i1:
|
178 | 214 | ; CHECK: # %bb.0: # %entry
|
@@ -520,7 +556,3 @@ entry:
|
520 | 556 | %b = call i16 @llvm.vector.reduce.add.nxv64i16(<vscale x 64 x i16> %a)
|
521 | 557 | ret i16 %b
|
522 | 558 | }
|
523 |
| - |
524 |
| -;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: |
525 |
| -; RV32: {{.*}} |
526 |
| -; RV64: {{.*}} |
|
0 commit comments