Skip to content

Commit 5792c22

Browse files
committed
Add test cases that are addressed by D76010
1 parent 196b48a commit 5792c22

File tree

1 file changed

+254
-0
lines changed

1 file changed

+254
-0
lines changed

llvm/test/Transforms/InstSimplify/freeze.ll

Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,199 @@ define i32 @make_const() {
1919
ret i32 %x
2020
}
2121

22+
define float @make_const2() {
23+
; CHECK-LABEL: @make_const2(
24+
; CHECK-NEXT: [[X:%.*]] = freeze float 1.000000e+01
25+
; CHECK-NEXT: ret float [[X]]
26+
;
27+
%x = freeze float 10.0
28+
ret float %x
29+
}
30+
31+
@glb = constant i32 0
32+
33+
define i32* @make_const_glb() {
34+
; CHECK-LABEL: @make_const_glb(
35+
; CHECK-NEXT: ret i32* @glb
36+
;
37+
%k = freeze i32* @glb
38+
ret i32* %k
39+
}
40+
41+
define i32()* @make_const_fn() {
42+
; CHECK-LABEL: @make_const_fn(
43+
; CHECK-NEXT: [[K:%.*]] = freeze i32 ()* @make_const
44+
; CHECK-NEXT: ret i32 ()* [[K]]
45+
;
46+
%k = freeze i32()* @make_const
47+
ret i32()* %k
48+
}
49+
50+
define i32* @make_const_null() {
51+
; CHECK-LABEL: @make_const_null(
52+
; CHECK-NEXT: [[K:%.*]] = freeze i32* null
53+
; CHECK-NEXT: ret i32* [[K]]
54+
;
55+
%k = freeze i32* null
56+
ret i32* %k
57+
}
58+
59+
define <2 x i32> @constvector() {
60+
; CHECK-LABEL: @constvector(
61+
; CHECK-NEXT: [[X:%.*]] = freeze <2 x i32> <i32 0, i32 1>
62+
; CHECK-NEXT: ret <2 x i32> [[X]]
63+
;
64+
%x = freeze <2 x i32> <i32 0, i32 1>
65+
ret <2 x i32> %x
66+
}
67+
68+
define <2 x i32> @constvector_noopt() {
69+
; CHECK-LABEL: @constvector_noopt(
70+
; CHECK-NEXT: [[X:%.*]] = freeze <2 x i32> <i32 0, i32 undef>
71+
; CHECK-NEXT: ret <2 x i32> [[X]]
72+
;
73+
%x = freeze <2 x i32> <i32 0, i32 undef>
74+
ret <2 x i32> %x
75+
}
76+
77+
define void @alloca() {
78+
; CHECK-LABEL: @alloca(
79+
; CHECK-NEXT: [[P:%.*]] = alloca i8
80+
; CHECK-NEXT: [[Y:%.*]] = freeze i8* [[P]]
81+
; CHECK-NEXT: call void @f3(i8* [[Y]])
82+
; CHECK-NEXT: ret void
83+
;
84+
%p = alloca i8
85+
%y = freeze i8* %p
86+
call void @f3(i8* %y)
87+
ret void
88+
}
89+
90+
define i8* @gep() {
91+
; CHECK-LABEL: @gep(
92+
; CHECK-NEXT: [[P:%.*]] = alloca [4 x i8]
93+
; CHECK-NEXT: [[Q:%.*]] = getelementptr [4 x i8], [4 x i8]* [[P]], i32 0, i32 6
94+
; CHECK-NEXT: [[Q2:%.*]] = freeze i8* [[Q]]
95+
; CHECK-NEXT: ret i8* [[Q2]]
96+
;
97+
%p = alloca [4 x i8]
98+
%q = getelementptr [4 x i8], [4 x i8]* %p, i32 0, i32 6
99+
%q2 = freeze i8* %q
100+
ret i8* %q2
101+
}
102+
103+
define i8* @gep_noopt(i32 %arg) {
104+
; CHECK-LABEL: @gep_noopt(
105+
; CHECK-NEXT: [[Q:%.*]] = getelementptr [4 x i8], [4 x i8]* null, i32 0, i32 [[ARG:%.*]]
106+
; CHECK-NEXT: [[Q2:%.*]] = freeze i8* [[Q]]
107+
; CHECK-NEXT: ret i8* [[Q2]]
108+
;
109+
%q = getelementptr [4 x i8], [4 x i8]* null, i32 0, i32 %arg
110+
%q2 = freeze i8* %q
111+
ret i8* %q2
112+
}
113+
114+
define i8* @gep_inbounds() {
115+
; CHECK-LABEL: @gep_inbounds(
116+
; CHECK-NEXT: [[P:%.*]] = alloca [4 x i8]
117+
; CHECK-NEXT: [[Q:%.*]] = getelementptr inbounds [4 x i8], [4 x i8]* [[P]], i32 0, i32 0
118+
; CHECK-NEXT: [[Q2:%.*]] = freeze i8* [[Q]]
119+
; CHECK-NEXT: ret i8* [[Q2]]
120+
;
121+
%p = alloca [4 x i8]
122+
%q = getelementptr inbounds [4 x i8], [4 x i8]* %p, i32 0, i32 0
123+
%q2 = freeze i8* %q
124+
ret i8* %q2
125+
}
126+
127+
define i8* @gep_inbounds_noopt(i32 %arg) {
128+
; CHECK-LABEL: @gep_inbounds_noopt(
129+
; CHECK-NEXT: [[P:%.*]] = alloca [4 x i8]
130+
; CHECK-NEXT: [[Q:%.*]] = getelementptr inbounds [4 x i8], [4 x i8]* [[P]], i32 0, i32 [[ARG:%.*]]
131+
; CHECK-NEXT: [[Q2:%.*]] = freeze i8* [[Q]]
132+
; CHECK-NEXT: ret i8* [[Q2]]
133+
;
134+
%p = alloca [4 x i8]
135+
%q = getelementptr inbounds [4 x i8], [4 x i8]* %p, i32 0, i32 %arg
136+
%q2 = freeze i8* %q
137+
ret i8* %q2
138+
}
139+
140+
define i32* @gep_inbounds_null() {
141+
; CHECK-LABEL: @gep_inbounds_null(
142+
; CHECK-NEXT: [[K:%.*]] = freeze i32* null
143+
; CHECK-NEXT: ret i32* [[K]]
144+
;
145+
%p = getelementptr inbounds i32, i32* null, i32 0
146+
%k = freeze i32* %p
147+
ret i32* %k
148+
}
149+
150+
define i32* @gep_inbounds_null_noopt(i32* %p) {
151+
; CHECK-LABEL: @gep_inbounds_null_noopt(
152+
; CHECK-NEXT: [[K:%.*]] = freeze i32* [[P:%.*]]
153+
; CHECK-NEXT: ret i32* [[K]]
154+
;
155+
%q = getelementptr inbounds i32, i32* %p, i32 0
156+
%k = freeze i32* %q
157+
ret i32* %k
158+
}
159+
160+
define i1 @icmp(i32 %a, i32 %b) {
161+
; CHECK-LABEL: @icmp(
162+
; CHECK-NEXT: [[A_FR:%.*]] = freeze i32 [[A:%.*]]
163+
; CHECK-NEXT: [[B_FR:%.*]] = freeze i32 [[B:%.*]]
164+
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[A_FR]], [[B_FR]]
165+
; CHECK-NEXT: ret i1 [[C]]
166+
;
167+
%a.fr = freeze i32 %a
168+
%b.fr = freeze i32 %b
169+
%c = icmp eq i32 %a.fr, %b.fr
170+
%c.fr = freeze i1 %c
171+
ret i1 %c.fr
172+
}
173+
174+
define i1 @icmp_noopt(i32 %a, i32 %b) {
175+
; CHECK-LABEL: @icmp_noopt(
176+
; CHECK-NEXT: [[C:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
177+
; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]]
178+
; CHECK-NEXT: ret i1 [[C_FR]]
179+
;
180+
%c = icmp eq i32 %a, %b
181+
%c.fr = freeze i1 %c
182+
ret i1 %c.fr
183+
}
184+
185+
define i1 @fcmp(float %x, float %y) {
186+
; CHECK-LABEL: @fcmp(
187+
; CHECK-NEXT: [[FX:%.*]] = freeze float [[X:%.*]]
188+
; CHECK-NEXT: [[FY:%.*]] = freeze float [[Y:%.*]]
189+
; CHECK-NEXT: [[C:%.*]] = fcmp oeq float [[FX]], [[FY]]
190+
; CHECK-NEXT: [[FC:%.*]] = freeze i1 [[C]]
191+
; CHECK-NEXT: ret i1 [[FC]]
192+
;
193+
%fx = freeze float %x
194+
%fy = freeze float %y
195+
%c = fcmp oeq float %fx, %fy
196+
%fc = freeze i1 %c
197+
ret i1 %fc
198+
}
199+
200+
define i1 @fcmp_noopt(float %x, float %y) {
201+
; CHECK-LABEL: @fcmp_noopt(
202+
; CHECK-NEXT: [[FX:%.*]] = freeze float [[X:%.*]]
203+
; CHECK-NEXT: [[FY:%.*]] = freeze float [[Y:%.*]]
204+
; CHECK-NEXT: [[C:%.*]] = fcmp nnan oeq float [[FX]], [[FY]]
205+
; CHECK-NEXT: [[FC:%.*]] = freeze i1 [[C]]
206+
; CHECK-NEXT: ret i1 [[FC]]
207+
;
208+
%fx = freeze float %x
209+
%fy = freeze float %y
210+
%c = fcmp nnan oeq float %fx, %fy
211+
%fc = freeze i1 %c
212+
ret i1 %fc
213+
}
214+
22215
define i1 @brcond(i1 %c, i1 %c2) {
23216
; CHECK-LABEL: @brcond(
24217
; CHECK-NEXT: br i1 [[C:%.*]], label [[A:%.*]], label [[B:%.*]]
@@ -40,6 +233,66 @@ B:
40233
ret i1 %f2
41234
}
42235

236+
define i32 @phi(i1 %cond, i1 %cond2, i32 %a0, i32 %a1) {
237+
; CHECK-LABEL: @phi(
238+
; CHECK-NEXT: ENTRY:
239+
; CHECK-NEXT: [[A0_FR:%.*]] = freeze i32 [[A0:%.*]]
240+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
241+
; CHECK: BB1:
242+
; CHECK-NEXT: [[A1_FR:%.*]] = freeze i32 [[A1:%.*]]
243+
; CHECK-NEXT: br i1 [[COND2:%.*]], label [[BB2]], label [[EXIT:%.*]]
244+
; CHECK: BB2:
245+
; CHECK-NEXT: [[PHI1:%.*]] = phi i32 [ [[A0_FR]], [[ENTRY:%.*]] ], [ [[A1_FR]], [[BB1]] ]
246+
; CHECK-NEXT: br label [[EXIT]]
247+
; CHECK: EXIT:
248+
; CHECK-NEXT: [[PHI2:%.*]] = phi i32 [ [[A0_FR]], [[BB1]] ], [ [[PHI1]], [[BB2]] ]
249+
; CHECK-NEXT: [[PHI2_FR:%.*]] = freeze i32 [[PHI2]]
250+
; CHECK-NEXT: ret i32 [[PHI2_FR]]
251+
;
252+
ENTRY:
253+
%a0.fr = freeze i32 %a0
254+
br i1 %cond, label %BB1, label %BB2
255+
BB1:
256+
%a1.fr = freeze i32 %a1
257+
br i1 %cond2, label %BB2, label %EXIT
258+
BB2:
259+
%phi1 = phi i32 [%a0.fr, %ENTRY], [%a1.fr, %BB1]
260+
br label %EXIT
261+
EXIT:
262+
%phi2 = phi i32 [%a0.fr, %BB1], [%phi1, %BB2]
263+
%phi2.fr = freeze i32 %phi2
264+
ret i32 %phi2.fr
265+
}
266+
267+
define i32 @phi_noopt(i1 %cond, i1 %cond2, i32 %a0, i32 %a1) {
268+
; CHECK-LABEL: @phi_noopt(
269+
; CHECK-NEXT: ENTRY:
270+
; CHECK-NEXT: [[A0_FR:%.*]] = freeze i32 [[A0:%.*]]
271+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
272+
; CHECK: BB1:
273+
; CHECK-NEXT: br i1 [[COND2:%.*]], label [[BB2]], label [[EXIT:%.*]]
274+
; CHECK: BB2:
275+
; CHECK-NEXT: [[PHI1:%.*]] = phi i32 [ [[A0_FR]], [[ENTRY:%.*]] ], [ [[A1:%.*]], [[BB1]] ]
276+
; CHECK-NEXT: br label [[EXIT]]
277+
; CHECK: EXIT:
278+
; CHECK-NEXT: [[PHI2:%.*]] = phi i32 [ [[A0_FR]], [[BB1]] ], [ [[PHI1]], [[BB2]] ]
279+
; CHECK-NEXT: [[PHI2_FR:%.*]] = freeze i32 [[PHI2]]
280+
; CHECK-NEXT: ret i32 [[PHI2_FR]]
281+
;
282+
ENTRY:
283+
%a0.fr = freeze i32 %a0
284+
br i1 %cond, label %BB1, label %BB2
285+
BB1:
286+
br i1 %cond2, label %BB2, label %EXIT
287+
BB2:
288+
%phi1 = phi i32 [%a0.fr, %ENTRY], [%a1, %BB1]
289+
br label %EXIT
290+
EXIT:
291+
%phi2 = phi i32 [%a0.fr, %BB1], [%phi1, %BB2]
292+
%phi2.fr = freeze i32 %phi2
293+
ret i32 %phi2.fr
294+
}
295+
43296
define i32 @brcond_switch(i32 %x) {
44297
; CHECK-LABEL: @brcond_switch(
45298
; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT:%.*]] [
@@ -81,3 +334,4 @@ B:
81334
}
82335
declare void @f1(i1)
83336
declare void @f2()
337+
declare void @f3(i8*)

0 commit comments

Comments
 (0)