Skip to content

Commit 681bd84

Browse files
authored
AMDGPU: Add baseline test for lane index simplification (#117962)
1 parent 7545283 commit 681bd84

File tree

1 file changed

+205
-0
lines changed

1 file changed

+205
-0
lines changed
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=instcombine < %s | FileCheck -check-prefixes=CHECK,WAVE64 %s
3+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mattr=+wavefrontsize32 -passes=instcombine < %s | FileCheck -check-prefixes=CHECK,WAVE32 %s
4+
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mattr=+wavefrontsize64 -passes=instcombine < %s | FileCheck -check-prefixes=CHECK,WAVE64 %s
5+
6+
; --------------------------------------------------------------------
7+
; llvm.amdgcn.readlane
8+
; --------------------------------------------------------------------
9+
10+
define i32 @readlane_31(i32 %arg) #0 {
11+
; CHECK-LABEL: define i32 @readlane_31(
12+
; CHECK-SAME: i32 [[ARG:%.*]]) #[[ATTR0:[0-9]+]] {
13+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG]], i32 31)
14+
; CHECK-NEXT: ret i32 [[RES]]
15+
;
16+
%res = call i32 @llvm.amdgcn.readlane.i32(i32 %arg, i32 31)
17+
ret i32 %res
18+
}
19+
20+
define i32 @readlane_32(i32 %arg) #0 {
21+
; CHECK-LABEL: define i32 @readlane_32(
22+
; CHECK-SAME: i32 [[ARG:%.*]]) #[[ATTR0]] {
23+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG]], i32 32)
24+
; CHECK-NEXT: ret i32 [[RES]]
25+
;
26+
%res = call i32 @llvm.amdgcn.readlane.i32(i32 %arg, i32 32)
27+
ret i32 %res
28+
}
29+
30+
define i32 @readlane_33(i32 %arg) #0 {
31+
; CHECK-LABEL: define i32 @readlane_33(
32+
; CHECK-SAME: i32 [[ARG:%.*]]) #[[ATTR0]] {
33+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG]], i32 33)
34+
; CHECK-NEXT: ret i32 [[RES]]
35+
;
36+
%res = call i32 @llvm.amdgcn.readlane.i32(i32 %arg, i32 33)
37+
ret i32 %res
38+
}
39+
40+
define i32 @readlane_63(i32 %arg) #0 {
41+
; CHECK-LABEL: define i32 @readlane_63(
42+
; CHECK-SAME: i32 [[ARG:%.*]]) #[[ATTR0]] {
43+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG]], i32 63)
44+
; CHECK-NEXT: ret i32 [[RES]]
45+
;
46+
%res = call i32 @llvm.amdgcn.readlane.i32(i32 %arg, i32 63)
47+
ret i32 %res
48+
}
49+
50+
define i32 @readlane_64(i32 %arg) #0 {
51+
; CHECK-LABEL: define i32 @readlane_64(
52+
; CHECK-SAME: i32 [[ARG:%.*]]) #[[ATTR0]] {
53+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG]], i32 64)
54+
; CHECK-NEXT: ret i32 [[RES]]
55+
;
56+
%res = call i32 @llvm.amdgcn.readlane.i32(i32 %arg, i32 64)
57+
ret i32 %res
58+
}
59+
60+
define i32 @readlane_and_31(i32 %arg, i32 %idx) #0 {
61+
; CHECK-LABEL: define i32 @readlane_and_31(
62+
; CHECK-SAME: i32 [[ARG:%.*]], i32 [[IDX:%.*]]) #[[ATTR0]] {
63+
; CHECK-NEXT: [[IDX_CLAMP:%.*]] = and i32 [[IDX]], 31
64+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG]], i32 [[IDX_CLAMP]])
65+
; CHECK-NEXT: ret i32 [[RES]]
66+
;
67+
%idx.clamp = and i32 %idx, 31
68+
%res = call i32 @llvm.amdgcn.readlane.i32(i32 %arg, i32 %idx.clamp)
69+
ret i32 %res
70+
}
71+
72+
define i32 @readlane_and_63(i32 %arg, i32 %idx) #0 {
73+
; CHECK-LABEL: define i32 @readlane_and_63(
74+
; CHECK-SAME: i32 [[ARG:%.*]], i32 [[IDX:%.*]]) #[[ATTR0]] {
75+
; CHECK-NEXT: [[IDX_CLAMP:%.*]] = and i32 [[IDX]], 63
76+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG]], i32 [[IDX_CLAMP]])
77+
; CHECK-NEXT: ret i32 [[RES]]
78+
;
79+
%idx.clamp = and i32 %idx, 63
80+
%res = call i32 @llvm.amdgcn.readlane.i32(i32 %arg, i32 %idx.clamp)
81+
ret i32 %res
82+
}
83+
84+
define i32 @readlane_poison(i32 %arg) #0 {
85+
; CHECK-LABEL: define i32 @readlane_poison(
86+
; CHECK-SAME: i32 [[ARG:%.*]]) #[[ATTR0]] {
87+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.readlane.i32(i32 [[ARG]], i32 poison)
88+
; CHECK-NEXT: ret i32 [[RES]]
89+
;
90+
%res = call i32 @llvm.amdgcn.readlane.i32(i32 %arg, i32 poison)
91+
ret i32 %res
92+
}
93+
94+
define float @readlane_f32_63(float %arg) #0 {
95+
; CHECK-LABEL: define float @readlane_f32_63(
96+
; CHECK-SAME: float [[ARG:%.*]]) #[[ATTR0]] {
97+
; CHECK-NEXT: [[RES:%.*]] = call float @llvm.amdgcn.readlane.f32(float [[ARG]], i32 63)
98+
; CHECK-NEXT: ret float [[RES]]
99+
;
100+
%res = call float @llvm.amdgcn.readlane.f32(float %arg, i32 63)
101+
ret float %res
102+
}
103+
104+
; --------------------------------------------------------------------
105+
; llvm.amdgcn.writelane
106+
; --------------------------------------------------------------------
107+
108+
define i32 @writelane_31(i32 %arg0, i32 %arg1) #0 {
109+
; CHECK-LABEL: define i32 @writelane_31(
110+
; CHECK-SAME: i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) #[[ATTR0]] {
111+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.writelane.i32(i32 [[ARG0]], i32 31, i32 [[ARG1]])
112+
; CHECK-NEXT: ret i32 [[RES]]
113+
;
114+
%res = call i32 @llvm.amdgcn.writelane.i32(i32 %arg0, i32 31, i32 %arg1)
115+
ret i32 %res
116+
}
117+
118+
define i32 @writelane_32(i32 %arg0, i32 %arg1) #0 {
119+
; CHECK-LABEL: define i32 @writelane_32(
120+
; CHECK-SAME: i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) #[[ATTR0]] {
121+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.writelane.i32(i32 [[ARG0]], i32 32, i32 [[ARG1]])
122+
; CHECK-NEXT: ret i32 [[RES]]
123+
;
124+
%res = call i32 @llvm.amdgcn.writelane.i32(i32 %arg0, i32 32, i32 %arg1)
125+
ret i32 %res
126+
}
127+
128+
define i32 @writelane_33(i32 %arg0, i32 %arg1) #0 {
129+
; CHECK-LABEL: define i32 @writelane_33(
130+
; CHECK-SAME: i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) #[[ATTR0]] {
131+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.writelane.i32(i32 [[ARG0]], i32 33, i32 [[ARG1]])
132+
; CHECK-NEXT: ret i32 [[RES]]
133+
;
134+
%res = call i32 @llvm.amdgcn.writelane.i32(i32 %arg0, i32 33, i32 %arg1)
135+
ret i32 %res
136+
}
137+
138+
define i32 @writelane_63(i32 %arg0, i32 %arg1) #0 {
139+
; CHECK-LABEL: define i32 @writelane_63(
140+
; CHECK-SAME: i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) #[[ATTR0]] {
141+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.writelane.i32(i32 [[ARG0]], i32 63, i32 [[ARG1]])
142+
; CHECK-NEXT: ret i32 [[RES]]
143+
;
144+
%res = call i32 @llvm.amdgcn.writelane.i32(i32 %arg0, i32 63, i32 %arg1)
145+
ret i32 %res
146+
}
147+
148+
define i32 @writelane_64(i32 %arg0, i32 %arg1) #0 {
149+
; CHECK-LABEL: define i32 @writelane_64(
150+
; CHECK-SAME: i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) #[[ATTR0]] {
151+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.writelane.i32(i32 [[ARG0]], i32 64, i32 [[ARG1]])
152+
; CHECK-NEXT: ret i32 [[RES]]
153+
;
154+
%res = call i32 @llvm.amdgcn.writelane.i32(i32 %arg0, i32 64, i32 %arg1)
155+
ret i32 %res
156+
}
157+
158+
define i32 @writelane_and_31(i32 %arg0, i32 %arg1, i32 %idx) #0 {
159+
; CHECK-LABEL: define i32 @writelane_and_31(
160+
; CHECK-SAME: i32 [[ARG0:%.*]], i32 [[ARG1:%.*]], i32 [[IDX:%.*]]) #[[ATTR0]] {
161+
; CHECK-NEXT: [[IDX_CLAMP:%.*]] = and i32 [[IDX]], 31
162+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.writelane.i32(i32 [[ARG0]], i32 [[IDX_CLAMP]], i32 [[ARG1]])
163+
; CHECK-NEXT: ret i32 [[RES]]
164+
;
165+
%idx.clamp = and i32 %idx, 31
166+
%res = call i32 @llvm.amdgcn.writelane.i32(i32 %arg0, i32 %idx.clamp, i32 %arg1)
167+
ret i32 %res
168+
}
169+
170+
define i32 @writelane_and_63(i32 %arg0, i32 %arg1, i32 %idx) #0 {
171+
; CHECK-LABEL: define i32 @writelane_and_63(
172+
; CHECK-SAME: i32 [[ARG0:%.*]], i32 [[ARG1:%.*]], i32 [[IDX:%.*]]) #[[ATTR0]] {
173+
; CHECK-NEXT: [[IDX_CLAMP:%.*]] = and i32 [[IDX]], 63
174+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.writelane.i32(i32 [[ARG0]], i32 [[IDX_CLAMP]], i32 [[ARG1]])
175+
; CHECK-NEXT: ret i32 [[RES]]
176+
;
177+
%idx.clamp = and i32 %idx, 63
178+
%res = call i32 @llvm.amdgcn.writelane.i32(i32 %arg0, i32 %idx.clamp, i32 %arg1)
179+
ret i32 %res
180+
}
181+
182+
define i32 @writelane_poison(i32 %arg0, i32 %arg1) #0 {
183+
; CHECK-LABEL: define i32 @writelane_poison(
184+
; CHECK-SAME: i32 [[ARG0:%.*]], i32 [[ARG1:%.*]]) #[[ATTR0]] {
185+
; CHECK-NEXT: [[RES:%.*]] = call i32 @llvm.amdgcn.writelane.i32(i32 [[ARG0]], i32 poison, i32 [[ARG1]])
186+
; CHECK-NEXT: ret i32 [[RES]]
187+
;
188+
%res = call i32 @llvm.amdgcn.writelane.i32(i32 %arg0, i32 poison, i32 %arg1)
189+
ret i32 %res
190+
}
191+
192+
define float @writelane_f32_63(float %arg0, float %arg1) #0 {
193+
; CHECK-LABEL: define float @writelane_f32_63(
194+
; CHECK-SAME: float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR0]] {
195+
; CHECK-NEXT: [[RES:%.*]] = call float @llvm.amdgcn.writelane.f32(float [[ARG0]], i32 63, float [[ARG1]])
196+
; CHECK-NEXT: ret float [[RES]]
197+
;
198+
%res = call float @llvm.amdgcn.writelane.f32(float %arg0, i32 63, float %arg1)
199+
ret float %res
200+
}
201+
202+
attributes #0 = { nounwind }
203+
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
204+
; WAVE32: {{.*}}
205+
; WAVE64: {{.*}}

0 commit comments

Comments
 (0)