1*b52db60cSMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2*b52db60cSMatt Arsenault; RUN: opt -S -p=globalopt %s | FileCheck %s 3*b52db60cSMatt Arsenault 4*b52db60cSMatt Arsenault 5*b52db60cSMatt Arsenault@llvm.used = appending global [1 x ptr] [ptr @ctor] 6*b52db60cSMatt Arsenault@gv0 = internal addrspace(1) global ptr null 7*b52db60cSMatt Arsenault@gv1 = internal addrspace(1) global ptr addrspace(3) null 8*b52db60cSMatt Arsenault@gv2 = internal addrspace(1) global ptr addrspace(1) null 9*b52db60cSMatt Arsenault@gv3 = internal addrspace(1) global ptr addrspace(1) null 10*b52db60cSMatt Arsenault 11*b52db60cSMatt Arsenaultdefine internal void @ctor() { 12*b52db60cSMatt Arsenault; CHECK-LABEL: define internal void @ctor() { 13*b52db60cSMatt Arsenault; CHECK-NEXT: tail call fastcc void @init0(ptr addrspacecast (ptr addrspace(1) null to ptr)) 14*b52db60cSMatt Arsenault; CHECK-NEXT: tail call fastcc void @init1(ptr addrspacecast (ptr addrspace(3) null to ptr)) 15*b52db60cSMatt Arsenault; CHECK-NEXT: tail call fastcc void @init2(ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1))) 16*b52db60cSMatt Arsenault; CHECK-NEXT: tail call fastcc void @init3(ptr addrspace(1) addrspacecast (ptr addrspace(2) null to ptr addrspace(1))) 17*b52db60cSMatt Arsenault; CHECK-NEXT: ret void 18*b52db60cSMatt Arsenault; 19*b52db60cSMatt Arsenault tail call void @init0(ptr addrspacecast (ptr addrspace(1) null to ptr)) 20*b52db60cSMatt Arsenault tail call void @init1(ptr addrspacecast (ptr addrspace(3) null to ptr)) 21*b52db60cSMatt Arsenault tail call void @init2(ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1))) 22*b52db60cSMatt Arsenault tail call void @init3(ptr addrspace(1) addrspacecast (ptr addrspace(2) null to ptr addrspace(1))) 23*b52db60cSMatt Arsenault ret void 24*b52db60cSMatt Arsenault} 25*b52db60cSMatt Arsenault 26*b52db60cSMatt Arsenaultdefine internal void @init0(ptr %T) { 27*b52db60cSMatt Arsenault; CHECK-LABEL: define internal fastcc void @init0 28*b52db60cSMatt Arsenault; CHECK-SAME: (ptr [[T:%.*]]) unnamed_addr { 29*b52db60cSMatt Arsenault; CHECK-NEXT: [[LD:%.*]] = load ptr, ptr addrspace(1) @gv0, align 8 30*b52db60cSMatt Arsenault; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[LD]], null 31*b52db60cSMatt Arsenault; CHECK-NEXT: store ptr addrspacecast (ptr addrspace(1) null to ptr), ptr addrspace(1) @gv0, align 8 32*b52db60cSMatt Arsenault; CHECK-NEXT: ret void 33*b52db60cSMatt Arsenault; 34*b52db60cSMatt Arsenault %ld = load ptr, ptr addrspace(1) @gv0, align 8 35*b52db60cSMatt Arsenault %cmp = icmp eq ptr %ld, null 36*b52db60cSMatt Arsenault store ptr addrspacecast (ptr addrspace(1) null to ptr), ptr addrspace(1) @gv0, align 8 37*b52db60cSMatt Arsenault ret void 38*b52db60cSMatt Arsenault} 39*b52db60cSMatt Arsenault 40*b52db60cSMatt Arsenaultdefine internal void @init1(ptr %T) { 41*b52db60cSMatt Arsenault; CHECK-LABEL: define internal fastcc void @init1 42*b52db60cSMatt Arsenault; CHECK-SAME: (ptr [[T:%.*]]) unnamed_addr { 43*b52db60cSMatt Arsenault; CHECK-NEXT: [[LD:%.*]] = load ptr addrspace(3), ptr addrspace(1) @gv1, align 4 44*b52db60cSMatt Arsenault; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr addrspace(3) [[LD]], null 45*b52db60cSMatt Arsenault; CHECK-NEXT: store ptr addrspacecast (ptr addrspace(3) null to ptr), ptr addrspace(1) @gv1, align 8 46*b52db60cSMatt Arsenault; CHECK-NEXT: ret void 47*b52db60cSMatt Arsenault; 48*b52db60cSMatt Arsenault %ld = load ptr addrspace(3), ptr addrspace(1) @gv1, align 4 49*b52db60cSMatt Arsenault %cmp = icmp eq ptr addrspace(3) %ld, null 50*b52db60cSMatt Arsenault store ptr addrspacecast (ptr addrspace(3) null to ptr), ptr addrspace(1) @gv1, align 8 51*b52db60cSMatt Arsenault ret void 52*b52db60cSMatt Arsenault} 53*b52db60cSMatt Arsenault 54*b52db60cSMatt Arsenaultdefine internal void @init2(ptr addrspace(1) %T) { 55*b52db60cSMatt Arsenault; CHECK-LABEL: define internal fastcc void @init2 56*b52db60cSMatt Arsenault; CHECK-SAME: (ptr addrspace(1) [[T:%.*]]) unnamed_addr { 57*b52db60cSMatt Arsenault; CHECK-NEXT: [[LD:%.*]] = load ptr addrspace(1), ptr addrspace(1) @gv2, align 4 58*b52db60cSMatt Arsenault; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr addrspace(1) [[LD]], null 59*b52db60cSMatt Arsenault; CHECK-NEXT: store ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1)), ptr addrspace(1) @gv2, align 8 60*b52db60cSMatt Arsenault; CHECK-NEXT: ret void 61*b52db60cSMatt Arsenault; 62*b52db60cSMatt Arsenault %ld = load ptr addrspace(1), ptr addrspace(1) @gv2, align 4 63*b52db60cSMatt Arsenault %cmp = icmp eq ptr addrspace(1) %ld, null 64*b52db60cSMatt Arsenault store ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1)), ptr addrspace(1) @gv2, align 8 65*b52db60cSMatt Arsenault ret void 66*b52db60cSMatt Arsenault} 67*b52db60cSMatt Arsenault 68*b52db60cSMatt Arsenaultdefine internal void @init3(ptr addrspace(1) %T) { 69*b52db60cSMatt Arsenault; CHECK-LABEL: define internal fastcc void @init3 70*b52db60cSMatt Arsenault; CHECK-SAME: (ptr addrspace(1) [[T:%.*]]) unnamed_addr { 71*b52db60cSMatt Arsenault; CHECK-NEXT: [[LD:%.*]] = load ptr addrspace(1), ptr addrspace(1) @gv3, align 4 72*b52db60cSMatt Arsenault; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr addrspace(1) [[LD]], null 73*b52db60cSMatt Arsenault; CHECK-NEXT: store ptr addrspace(1) addrspacecast (ptr addrspace(2) null to ptr addrspace(1)), ptr addrspace(1) @gv3, align 8 74*b52db60cSMatt Arsenault; CHECK-NEXT: ret void 75*b52db60cSMatt Arsenault; 76*b52db60cSMatt Arsenault %ld = load ptr addrspace(1), ptr addrspace(1) @gv3, align 4 77*b52db60cSMatt Arsenault %cmp = icmp eq ptr addrspace(1) %ld, null 78*b52db60cSMatt Arsenault store ptr addrspace(1) addrspacecast (ptr addrspace(2) null to ptr addrspace(1)), ptr addrspace(1) @gv3, align 8 79*b52db60cSMatt Arsenault ret void 80*b52db60cSMatt Arsenault} 81