@@ -19,6 +19,199 @@ define i32 @make_const() {
19
19
ret i32 %x
20
20
}
21
21
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
+
22
215
define i1 @brcond (i1 %c , i1 %c2 ) {
23
216
; CHECK-LABEL: @brcond(
24
217
; CHECK-NEXT: br i1 [[C:%.*]], label [[A:%.*]], label [[B:%.*]]
40
233
ret i1 %f2
41
234
}
42
235
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
+
43
296
define i32 @brcond_switch (i32 %x ) {
44
297
; CHECK-LABEL: @brcond_switch(
45
298
; CHECK-NEXT: switch i32 [[X:%.*]], label [[EXIT:%.*]] [
81
334
}
82
335
declare void @f1 (i1 )
83
336
declare void @f2 ()
337
+ declare void @f3 (i8* )
0 commit comments