Skip to content

Commit 6d13263

Browse files
authored
[RISCV] Add tests for combineBinOpOfZExts. NFC (#86689)
Unlike add, sub and mul, we don't have widening instructions for div, rem and logical ops, so we don't have any test coverage if we were to extend combineBinOpOfZExts to handle them. Adding tests coincidentally revealed that logical ops are already narrowed as a generic DAG combine via DAGCombiner::hoistLogicOpWithSameOpcodeHands. So we don't actually need to run combineBinOpOfZExts on them.
1 parent aa2d5d5 commit 6d13263

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
3+
; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
4+
5+
; Check that we perform binary arithmetic in a narrower type where possible, via
6+
; combineBinOpOfZExt or otherwise.
7+
8+
define <vscale x 8 x i32> @add(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
9+
; CHECK-LABEL: add:
10+
; CHECK: # %bb.0:
11+
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
12+
; CHECK-NEXT: vwaddu.vv v12, v8, v9
13+
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
14+
; CHECK-NEXT: vzext.vf2 v8, v12
15+
; CHECK-NEXT: ret
16+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
17+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
18+
%add = add <vscale x 8 x i32> %a.zext, %b.zext
19+
ret <vscale x 8 x i32> %add
20+
}
21+
22+
define <vscale x 8 x i32> @sub(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
23+
; CHECK-LABEL: sub:
24+
; CHECK: # %bb.0:
25+
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
26+
; CHECK-NEXT: vwsubu.vv v12, v8, v9
27+
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
28+
; CHECK-NEXT: vsext.vf2 v8, v12
29+
; CHECK-NEXT: ret
30+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
31+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
32+
%sub = sub <vscale x 8 x i32> %a.zext, %b.zext
33+
ret <vscale x 8 x i32> %sub
34+
}
35+
36+
define <vscale x 8 x i32> @mul(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
37+
; CHECK-LABEL: mul:
38+
; CHECK: # %bb.0:
39+
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
40+
; CHECK-NEXT: vwmulu.vv v12, v8, v9
41+
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
42+
; CHECK-NEXT: vzext.vf2 v8, v12
43+
; CHECK-NEXT: ret
44+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
45+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
46+
%mul = mul <vscale x 8 x i32> %a.zext, %b.zext
47+
ret <vscale x 8 x i32> %mul
48+
}
49+
50+
define <vscale x 8 x i32> @sdiv(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
51+
; CHECK-LABEL: sdiv:
52+
; CHECK: # %bb.0:
53+
; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
54+
; CHECK-NEXT: vzext.vf4 v12, v8
55+
; CHECK-NEXT: vzext.vf4 v16, v9
56+
; CHECK-NEXT: vdivu.vv v8, v12, v16
57+
; CHECK-NEXT: ret
58+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
59+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
60+
%sdiv = sdiv <vscale x 8 x i32> %a.zext, %b.zext
61+
ret <vscale x 8 x i32> %sdiv
62+
}
63+
64+
define <vscale x 8 x i32> @udiv(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
65+
; CHECK-LABEL: udiv:
66+
; CHECK: # %bb.0:
67+
; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
68+
; CHECK-NEXT: vzext.vf4 v12, v8
69+
; CHECK-NEXT: vzext.vf4 v16, v9
70+
; CHECK-NEXT: vdivu.vv v8, v12, v16
71+
; CHECK-NEXT: ret
72+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
73+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
74+
%udiv = udiv <vscale x 8 x i32> %a.zext, %b.zext
75+
ret <vscale x 8 x i32> %udiv
76+
}
77+
78+
define <vscale x 8 x i32> @srem(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
79+
; CHECK-LABEL: srem:
80+
; CHECK: # %bb.0:
81+
; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
82+
; CHECK-NEXT: vzext.vf4 v12, v8
83+
; CHECK-NEXT: vzext.vf4 v16, v9
84+
; CHECK-NEXT: vremu.vv v8, v12, v16
85+
; CHECK-NEXT: ret
86+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
87+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
88+
%srem = srem <vscale x 8 x i32> %a.zext, %b.zext
89+
ret <vscale x 8 x i32> %srem
90+
}
91+
92+
define <vscale x 8 x i32> @urem(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
93+
; CHECK-LABEL: urem:
94+
; CHECK: # %bb.0:
95+
; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
96+
; CHECK-NEXT: vzext.vf4 v12, v8
97+
; CHECK-NEXT: vzext.vf4 v16, v9
98+
; CHECK-NEXT: vremu.vv v8, v12, v16
99+
; CHECK-NEXT: ret
100+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
101+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
102+
%urem = urem <vscale x 8 x i32> %a.zext, %b.zext
103+
ret <vscale x 8 x i32> %urem
104+
}
105+
106+
define <vscale x 8 x i32> @and(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
107+
; CHECK-LABEL: and:
108+
; CHECK: # %bb.0:
109+
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
110+
; CHECK-NEXT: vand.vv v12, v8, v9
111+
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
112+
; CHECK-NEXT: vzext.vf4 v8, v12
113+
; CHECK-NEXT: ret
114+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
115+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
116+
%shl = and <vscale x 8 x i32> %a.zext, %b.zext
117+
ret <vscale x 8 x i32> %shl
118+
}
119+
120+
define <vscale x 8 x i32> @or(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
121+
; CHECK-LABEL: or:
122+
; CHECK: # %bb.0:
123+
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
124+
; CHECK-NEXT: vor.vv v12, v8, v9
125+
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
126+
; CHECK-NEXT: vzext.vf4 v8, v12
127+
; CHECK-NEXT: ret
128+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
129+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
130+
%or = or <vscale x 8 x i32> %a.zext, %b.zext
131+
ret <vscale x 8 x i32> %or
132+
}
133+
134+
define <vscale x 8 x i32> @xor(<vscale x 8 x i8> %a, <vscale x 8 x i8> %b) {
135+
; CHECK-LABEL: xor:
136+
; CHECK: # %bb.0:
137+
; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma
138+
; CHECK-NEXT: vxor.vv v12, v8, v9
139+
; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma
140+
; CHECK-NEXT: vzext.vf4 v8, v12
141+
; CHECK-NEXT: ret
142+
%a.zext = zext <vscale x 8 x i8> %a to <vscale x 8 x i32>
143+
%b.zext = zext <vscale x 8 x i8> %b to <vscale x 8 x i32>
144+
%xor = xor <vscale x 8 x i32> %a.zext, %b.zext
145+
ret <vscale x 8 x i32> %xor
146+
}

0 commit comments

Comments
 (0)