@@ -282,14 +282,111 @@ define i1 @gep17() {
282
282
ret i1 %cmp
283
283
}
284
284
285
- @weak = extern_weak global i8
285
+ @extern_weak = extern_weak global i8
286
286
287
287
define i1 @extern_weak_may_be_null () {
288
288
; CHECK-LABEL: @extern_weak_may_be_null(
289
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @weak , null
289
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @extern_weak , null
290
290
; CHECK-NEXT: ret i1 [[CMP]]
291
291
;
292
- %cmp = icmp ne ptr @weak , null
292
+ %cmp = icmp ne ptr @extern_weak , null
293
+ ret i1 %cmp
294
+ }
295
+
296
+ ; Don't fold this. @A might really be allocated next to @B, in which case the
297
+ ; icmp should return true. It's not valid to *dereference* in @B from a pointer
298
+ ; based on @A, but icmp isn't a dereference.
299
+ define i1 @globals_might_be_adjacent () {
300
+ ; CHECK-LABEL: @globals_might_be_adjacent(
301
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr getelementptr inbounds (i32, ptr @A, i64 1), @B
302
+ ; CHECK-NEXT: ret i1 [[CMP]]
303
+ ;
304
+ %cmp = icmp eq ptr getelementptr inbounds (i32 , ptr @A , i64 1 ), @B
305
+ ret i1 %cmp
306
+ }
307
+
308
+ define i1 @globals_might_be_adjacent2 () {
309
+ ; CHECK-LABEL: @globals_might_be_adjacent2(
310
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr getelementptr inbounds (i64, ptr @A, i64 1), getelementptr inbounds (i64, ptr @B, i64 2)
311
+ ; CHECK-NEXT: ret i1 [[CMP]]
312
+ ;
313
+ %cmp = icmp eq ptr getelementptr inbounds (i64 , ptr @A , i64 1 ), getelementptr inbounds (i64 , ptr @B , i64 2 )
314
+ ret i1 %cmp
315
+ }
316
+
317
+ @weak = weak global i32 0
318
+
319
+ ; An object with weak linkage cannot have it's identity determined at compile time.
320
+ define i1 @weak_comparison () {
321
+ ; CHECK-LABEL: @weak_comparison(
322
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr @weak, @A
323
+ ; CHECK-NEXT: ret i1 [[CMP]]
324
+ ;
325
+ %cmp = icmp eq ptr @weak , @A
326
+ ret i1 %cmp
327
+ }
328
+
329
+ @empty.1 = external global [0 x i8 ], align 1
330
+ @empty.2 = external global [0 x i8 ], align 1
331
+
332
+ ; Empty globals might end up anywhere, even on top of another global.
333
+ define i1 @empty_global_comparison () {
334
+ ; CHECK-LABEL: @empty_global_comparison(
335
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr @empty.1, @empty.2
336
+ ; CHECK-NEXT: ret i1 [[CMP]]
337
+ ;
338
+ %cmp = icmp eq ptr @empty.1 , @empty.2
339
+ ret i1 %cmp
340
+ }
341
+
342
+ @unnamed.1 = unnamed_addr constant [5 x i8 ] c "asdf\00 "
343
+ @unnamed.2 = unnamed_addr constant [5 x i8 ] c "asdf\00 "
344
+
345
+ ; Two unnamed_addr globals can share an address
346
+ define i1 @unnamed_addr_comparison () {
347
+ ; CHECK-LABEL: @unnamed_addr_comparison(
348
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr @unnamed.1, @unnamed.2
349
+ ; CHECK-NEXT: ret i1 [[CMP]]
350
+ ;
351
+ %cmp = icmp eq ptr @unnamed.1 , @unnamed.2
352
+ ret i1 %cmp
353
+ }
354
+
355
+ @addrspace3 = internal addrspace (3 ) global i32 undef
356
+
357
+ define i1 @no.fold.addrspace.icmp.eq.gv.null () {
358
+ ; CHECK-LABEL: @no.fold.addrspace.icmp.eq.gv.null(
359
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr addrspace(3) @addrspace3, null
360
+ ; CHECK-NEXT: ret i1 [[CMP]]
361
+ ;
362
+ %cmp = icmp eq ptr addrspace (3 ) @addrspace3 , null
363
+ ret i1 %cmp
364
+ }
365
+
366
+ define i1 @no.fold.addrspace.icmp.eq.null.gv () {
367
+ ; CHECK-LABEL: @no.fold.addrspace.icmp.eq.null.gv(
368
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr addrspace(3) null, @addrspace3
369
+ ; CHECK-NEXT: ret i1 [[CMP]]
370
+ ;
371
+ %cmp = icmp eq ptr addrspace (3 ) null , @addrspace3
372
+ ret i1 %cmp
373
+ }
374
+
375
+ define i1 @no.fold.addrspace.icmp.ne.gv.null () {
376
+ ; CHECK-LABEL: @no.fold.addrspace.icmp.ne.gv.null(
377
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr addrspace(3) @addrspace3, null
378
+ ; CHECK-NEXT: ret i1 [[CMP]]
379
+ ;
380
+ %cmp = icmp ne ptr addrspace (3 ) @addrspace3 , null
381
+ ret i1 %cmp
382
+ }
383
+
384
+ define i1 @no.fold.addrspace.icmp.ne.null.gv () {
385
+ ; CHECK-LABEL: @no.fold.addrspace.icmp.ne.null.gv(
386
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr addrspace(3) null, @addrspace3
387
+ ; CHECK-NEXT: ret i1 [[CMP]]
388
+ ;
389
+ %cmp = icmp ne ptr addrspace (3 ) null , @addrspace3
293
390
ret i1 %cmp
294
391
}
295
392
0 commit comments