@@ -194,6 +194,165 @@ if.end:
194
194
ret i32 %add
195
195
}
196
196
197
+ define i64 @load_before_store_noescape_byval (ptr byval ([2 x i32 ]) %a , i64 %i , i32 %b ) {
198
+ ; CHECK-LABEL: @load_before_store_noescape_byval(
199
+ ; CHECK-NEXT: entry:
200
+ ; CHECK-NEXT: store i64 -1, ptr [[A:%.*]], align 8
201
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 [[I:%.*]]
202
+ ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
203
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
204
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
205
+ ; CHECK: if.then:
206
+ ; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
207
+ ; CHECK-NEXT: br label [[IF_END]]
208
+ ; CHECK: if.end:
209
+ ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
210
+ ; CHECK-NEXT: ret i64 [[V2]]
211
+ ;
212
+ entry:
213
+ store i64 -1 , ptr %a , align 8
214
+ %arrayidx = getelementptr inbounds [2 x i32 ], ptr %a , i64 0 , i64 %i
215
+ %v = load i32 , ptr %arrayidx , align 4
216
+ %cmp = icmp slt i32 %v , %b
217
+ br i1 %cmp , label %if.then , label %if.end
218
+
219
+ if.then:
220
+ store i32 %b , ptr %arrayidx , align 4
221
+ br label %if.end
222
+
223
+ if.end:
224
+ %v2 = load i64 , ptr %a , align 8
225
+ ret i64 %v2
226
+ }
227
+
228
+ declare noalias ptr @malloc (i64 %size )
229
+
230
+ define i64 @load_before_store_noescape_malloc (i64 %i , i32 %b ) {
231
+ ; CHECK-LABEL: @load_before_store_noescape_malloc(
232
+ ; CHECK-NEXT: entry:
233
+ ; CHECK-NEXT: [[A:%.*]] = call ptr @malloc(i64 8)
234
+ ; CHECK-NEXT: store i64 -1, ptr [[A]], align 8
235
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 [[I:%.*]]
236
+ ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
237
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
238
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
239
+ ; CHECK: if.then:
240
+ ; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
241
+ ; CHECK-NEXT: br label [[IF_END]]
242
+ ; CHECK: if.end:
243
+ ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
244
+ ; CHECK-NEXT: ret i64 [[V2]]
245
+ ;
246
+ entry:
247
+ %a = call ptr @malloc (i64 8 )
248
+ store i64 -1 , ptr %a , align 8
249
+ %arrayidx = getelementptr inbounds [2 x i32 ], ptr %a , i64 0 , i64 %i
250
+ %v = load i32 , ptr %arrayidx , align 4
251
+ %cmp = icmp slt i32 %v , %b
252
+ br i1 %cmp , label %if.then , label %if.end
253
+
254
+ if.then:
255
+ store i32 %b , ptr %arrayidx , align 4
256
+ br label %if.end
257
+
258
+ if.end:
259
+ %v2 = load i64 , ptr %a , align 8
260
+ ret i64 %v2
261
+ }
262
+
263
+ define i64 @load_before_store_noescape_writable (ptr noalias writable dereferenceable (8 ) %a , i64 %i , i32 %b ) {
264
+ ; CHECK-LABEL: @load_before_store_noescape_writable(
265
+ ; CHECK-NEXT: entry:
266
+ ; CHECK-NEXT: store i64 -1, ptr [[A:%.*]], align 8
267
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
268
+ ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
269
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
270
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
271
+ ; CHECK: if.then:
272
+ ; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
273
+ ; CHECK-NEXT: br label [[IF_END]]
274
+ ; CHECK: if.end:
275
+ ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
276
+ ; CHECK-NEXT: ret i64 [[V2]]
277
+ ;
278
+ entry:
279
+ store i64 -1 , ptr %a , align 8
280
+ %arrayidx = getelementptr inbounds [2 x i32 ], ptr %a , i64 0 , i64 1
281
+ %v = load i32 , ptr %arrayidx , align 4
282
+ %cmp = icmp slt i32 %v , %b
283
+ br i1 %cmp , label %if.then , label %if.end
284
+
285
+ if.then:
286
+ store i32 %b , ptr %arrayidx , align 4
287
+ br label %if.end
288
+
289
+ if.end:
290
+ %v2 = load i64 , ptr %a , align 8
291
+ ret i64 %v2
292
+ }
293
+
294
+ define i64 @load_before_store_noescape_writable_missing_noalias (ptr writable dereferenceable (8 ) %a , i64 %i , i32 %b ) {
295
+ ; CHECK-LABEL: @load_before_store_noescape_writable_missing_noalias(
296
+ ; CHECK-NEXT: entry:
297
+ ; CHECK-NEXT: store i64 -1, ptr [[A:%.*]], align 8
298
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
299
+ ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
300
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
301
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
302
+ ; CHECK: if.then:
303
+ ; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
304
+ ; CHECK-NEXT: br label [[IF_END]]
305
+ ; CHECK: if.end:
306
+ ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
307
+ ; CHECK-NEXT: ret i64 [[V2]]
308
+ ;
309
+ entry:
310
+ store i64 -1 , ptr %a , align 8
311
+ %arrayidx = getelementptr inbounds [2 x i32 ], ptr %a , i64 0 , i64 1
312
+ %v = load i32 , ptr %arrayidx , align 4
313
+ %cmp = icmp slt i32 %v , %b
314
+ br i1 %cmp , label %if.then , label %if.end
315
+
316
+ if.then:
317
+ store i32 %b , ptr %arrayidx , align 4
318
+ br label %if.end
319
+
320
+ if.end:
321
+ %v2 = load i64 , ptr %a , align 8
322
+ ret i64 %v2
323
+ }
324
+
325
+ define i64 @load_before_store_noescape_writable_missing_derefable (ptr noalias writable %a , i64 %i , i32 %b ) {
326
+ ; CHECK-LABEL: @load_before_store_noescape_writable_missing_derefable(
327
+ ; CHECK-NEXT: entry:
328
+ ; CHECK-NEXT: store i64 -1, ptr [[A:%.*]], align 8
329
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i64 0, i64 1
330
+ ; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
331
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[V]], [[B:%.*]]
332
+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
333
+ ; CHECK: if.then:
334
+ ; CHECK-NEXT: store i32 [[B]], ptr [[ARRAYIDX]], align 4
335
+ ; CHECK-NEXT: br label [[IF_END]]
336
+ ; CHECK: if.end:
337
+ ; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[A]], align 8
338
+ ; CHECK-NEXT: ret i64 [[V2]]
339
+ ;
340
+ entry:
341
+ store i64 -1 , ptr %a , align 8
342
+ %arrayidx = getelementptr inbounds [2 x i32 ], ptr %a , i64 0 , i64 1
343
+ %v = load i32 , ptr %arrayidx , align 4
344
+ %cmp = icmp slt i32 %v , %b
345
+ br i1 %cmp , label %if.then , label %if.end
346
+
347
+ if.then:
348
+ store i32 %b , ptr %arrayidx , align 4
349
+ br label %if.end
350
+
351
+ if.end:
352
+ %v2 = load i64 , ptr %a , align 8
353
+ ret i64 %v2
354
+ }
355
+
197
356
declare void @fork_some_threads (ptr );
198
357
declare void @join_some_threads ();
199
358
0 commit comments