1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-apple-ios -O2 -aarch64-collect-loh -aarch64-collect-loh-bb-only=false < %s -o - | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm64-linux-gnu -O2 -aarch64-collect-loh -aarch64-collect-loh-bb-only=false < %s -o - | FileCheck %s --check-prefix=CHECK-ELF 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK-ELF-NOT: .loh 5*9880d681SAndroid Build Coastguard Worker; CHECK-ELF-NOT: AdrpAdrp 6*9880d681SAndroid Build Coastguard Worker; CHECK-ELF-NOT: AdrpAdd 7*9880d681SAndroid Build Coastguard Worker; CHECK-ELF-NOT: AdrpLdrGot 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker@a = internal unnamed_addr global i32 0, align 4 10*9880d681SAndroid Build Coastguard Worker@b = external global i32 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; Function Attrs: noinline nounwind ssp 13*9880d681SAndroid Build Coastguard Workerdefine void @foo(i32 %t) { 14*9880d681SAndroid Build Coastguard Workerentry: 15*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @a, align 4 16*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %tmp, %t 17*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* @a, align 4 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind ssp 22*9880d681SAndroid Build Coastguard Worker; Testcase for <rdar://problem/15438605>, AdrpAdrp reuse is valid only when the first adrp 23*9880d681SAndroid Build Coastguard Worker; dominates the second. 24*9880d681SAndroid Build Coastguard Worker; The first adrp comes from the loading of 'a' and the second the loading of 'b'. 25*9880d681SAndroid Build Coastguard Worker; 'a' is loaded in if.then, 'b' in if.end4, if.then does not dominates if.end4. 26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _test 27*9880d681SAndroid Build Coastguard Worker; CHECK: ret 28*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .loh AdrpAdrp 29*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i32 %t) { 30*9880d681SAndroid Build Coastguard Workerentry: 31*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i32 %t, 5 32*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then, label %if.end4 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 35*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @a, align 4 36*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %tmp, %t 37*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp sgt i32 %add, 12 38*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %if.then2, label %if.end4 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerif.then2: ; preds = %if.then 41*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %add) 42*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @a, align 4 43*9880d681SAndroid Build Coastguard Worker br label %if.end4 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerif.end4: ; preds = %if.then2, %if.then, %entry 46*9880d681SAndroid Build Coastguard Worker %t.addr.0 = phi i32 [ %tmp1, %if.then2 ], [ %t, %if.then ], [ %t, %entry ] 47*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* @b, align 4 48*9880d681SAndroid Build Coastguard Worker %add5 = add nsw i32 %tmp2, %t.addr.0 49*9880d681SAndroid Build Coastguard Worker tail call void @foo(i32 %add5) 50*9880d681SAndroid Build Coastguard Worker %tmp3 = load i32, i32* @b, align 4 51*9880d681SAndroid Build Coastguard Worker %add6 = add nsw i32 %tmp3, %t.addr.0 52*9880d681SAndroid Build Coastguard Worker ret i32 %add6 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker@C = common global i32 0, align 4 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; Check that we catch AdrpLdrGotLdr case when we have a simple chain: 58*9880d681SAndroid Build Coastguard Worker; adrp -> ldrgot -> ldr. 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getC 60*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _C@GOTPAGEOFF] 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr w0, {{\[}}[[LDRGOT_REG]]] 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 67*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 68*9880d681SAndroid Build Coastguard Workerdefine i32 @getC() { 69*9880d681SAndroid Build Coastguard Worker %res = load i32, i32* @C, align 4 70*9880d681SAndroid Build Coastguard Worker ret i32 %res 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker; LDRSW supports loading from a literal. 74*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtC 76*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _C@GOTPAGEOFF] 80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsw x0, {{\[}}[[LDRGOT_REG]]] 82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 83*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 84*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExtC() { 85*9880d681SAndroid Build Coastguard Worker %res = load i32, i32* @C, align 4 86*9880d681SAndroid Build Coastguard Worker %sextres = sext i32 %res to i64 87*9880d681SAndroid Build Coastguard Worker ret i64 %sextres 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; It may not be safe to fold the literal in the load if the address is 91*9880d681SAndroid Build Coastguard Worker; used several times. 92*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGot for those. 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSeveralC 94*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _C@GOTPAGEOFF] 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LOAD:w[0-9]+]], {{\[}}[[LDRGOT_REG]]] 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADD:w[0-9]+]], [[LOAD]], w0 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[ADD]], {{\[}}[[LDRGOT_REG]]] 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 102*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot [[ADRP_LABEL]], [[LDRGOT_LABEL]] 103*9880d681SAndroid Build Coastguard Workerdefine void @getSeveralC(i32 %t) { 104*9880d681SAndroid Build Coastguard Workerentry: 105*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @C, align 4 106*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %tmp, %t 107*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* @C, align 4 108*9880d681SAndroid Build Coastguard Worker ret void 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Make sure we catch that: 112*9880d681SAndroid Build Coastguard Worker; adrp -> ldrgot -> str. 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setC 114*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _C@GOTPAGE 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _C@GOTPAGEOFF] 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str w0, {{\[}}[[LDRGOT_REG]]] 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 121*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 122*9880d681SAndroid Build Coastguard Workerdefine void @setC(i32 %t) { 123*9880d681SAndroid Build Coastguard Workerentry: 124*9880d681SAndroid Build Coastguard Worker store i32 %t, i32* @C, align 4 125*9880d681SAndroid Build Coastguard Worker ret void 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; Perform the same tests for internal global and a displacement 129*9880d681SAndroid Build Coastguard Worker; in the addressing mode. 130*9880d681SAndroid Build Coastguard Worker; Indeed we will get an ADD for those instead of LOADGot. 131*9880d681SAndroid Build Coastguard Worker@InternalC = internal global i32 0, align 4 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker; Check that we catch AdrpAddLdr case when we have a simple chain: 134*9880d681SAndroid Build Coastguard Worker; adrp -> add -> ldr. 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getInternalCPlus4 136*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE 138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]: 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF 140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr w0, {{\[}}[[ADDGOT_REG]], #16] 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 143*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAddLdr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]] 144*9880d681SAndroid Build Coastguard Workerdefine i32 @getInternalCPlus4() { 145*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* @InternalC, i32 4 146*9880d681SAndroid Build Coastguard Worker %res = load i32, i32* %addr, align 4 147*9880d681SAndroid Build Coastguard Worker ret i32 %res 148*9880d681SAndroid Build Coastguard Worker} 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Worker; LDRSW supports loading from a literal. 151*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtInternalCPlus4 153*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE 155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]: 156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsw x0, {{\[}}[[ADDGOT_REG]], #16] 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 160*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAddLdr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]] 161*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExtInternalCPlus4() { 162*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* @InternalC, i32 4 163*9880d681SAndroid Build Coastguard Worker %res = load i32, i32* %addr, align 4 164*9880d681SAndroid Build Coastguard Worker %sextres = sext i32 %res to i64 165*9880d681SAndroid Build Coastguard Worker ret i64 %sextres 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; It may not be safe to fold the literal in the load if the address is 169*9880d681SAndroid Build Coastguard Worker; used several times. 170*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpAdd for those. 171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSeveralInternalCPlus4 172*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]: 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LOAD:w[0-9]+]], {{\[}}[[ADDGOT_REG]], #16] 177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADD:w[0-9]+]], [[LOAD]], w0 178*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[ADD]], {{\[}}[[ADDGOT_REG]], #16] 179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 180*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAdd [[ADRP_LABEL]], [[ADDGOT_LABEL]] 181*9880d681SAndroid Build Coastguard Workerdefine void @getSeveralInternalCPlus4(i32 %t) { 182*9880d681SAndroid Build Coastguard Workerentry: 183*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* @InternalC, i32 4 184*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %addr, align 4 185*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %tmp, %t 186*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %addr, align 4 187*9880d681SAndroid Build Coastguard Worker ret void 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker; Make sure we catch that: 191*9880d681SAndroid Build Coastguard Worker; adrp -> add -> str. 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setInternalCPlus4 193*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADDGOT_LABEL:Lloh[0-9]+]]: 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADDGOT_REG:x[0-9]+]], [[ADRP_REG]], _InternalC@PAGEOFF 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str w0, {{\[}}[[ADDGOT_REG]], #16] 199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 200*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAddStr [[ADRP_LABEL]], [[ADDGOT_LABEL]], [[LDR_LABEL]] 201*9880d681SAndroid Build Coastguard Workerdefine void @setInternalCPlus4(i32 %t) { 202*9880d681SAndroid Build Coastguard Workerentry: 203*9880d681SAndroid Build Coastguard Worker %addr = getelementptr i32, i32* @InternalC, i32 4 204*9880d681SAndroid Build Coastguard Worker store i32 %t, i32* %addr, align 4 205*9880d681SAndroid Build Coastguard Worker ret void 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; Check that we catch AdrpAddLdr case when we have a simple chain: 209*9880d681SAndroid Build Coastguard Worker; adrp -> ldr. 210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getInternalC 211*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr w0, {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF] 215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 216*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdr [[ADRP_LABEL]], [[LDR_LABEL]] 217*9880d681SAndroid Build Coastguard Workerdefine i32 @getInternalC() { 218*9880d681SAndroid Build Coastguard Worker %res = load i32, i32* @InternalC, align 4 219*9880d681SAndroid Build Coastguard Worker ret i32 %res 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker; LDRSW supports loading from a literal. 223*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtInternalC 225*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE 227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsw x0, {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF] 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 230*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdr [[ADRP_LABEL]], [[LDR_LABEL]] 231*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExtInternalC() { 232*9880d681SAndroid Build Coastguard Worker %res = load i32, i32* @InternalC, align 4 233*9880d681SAndroid Build Coastguard Worker %sextres = sext i32 %res to i64 234*9880d681SAndroid Build Coastguard Worker ret i64 %sextres 235*9880d681SAndroid Build Coastguard Worker} 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker; It may not be safe to fold the literal in the load if the address is 238*9880d681SAndroid Build Coastguard Worker; used several times. 239*9880d681SAndroid Build Coastguard Worker; Make sure we do not catch anything here. We have a adrp alone, 240*9880d681SAndroid Build Coastguard Worker; there is not much we can do about it. 241*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSeveralInternalC 242*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LOAD:w[0-9]+]], {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF] 244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add [[ADD:w[0-9]+]], [[LOAD]], w0 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str [[ADD]], {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF] 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 247*9880d681SAndroid Build Coastguard Workerdefine void @getSeveralInternalC(i32 %t) { 248*9880d681SAndroid Build Coastguard Workerentry: 249*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* @InternalC, align 4 250*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %tmp, %t 251*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* @InternalC, align 4 252*9880d681SAndroid Build Coastguard Worker ret void 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker; Make sure we do not catch anything when: 256*9880d681SAndroid Build Coastguard Worker; adrp -> str. 257*9880d681SAndroid Build Coastguard Worker; We cannot fold anything in the str at this point. 258*9880d681SAndroid Build Coastguard Worker; Indeed, strs do not support litterals. 259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setInternalC 260*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[ADRP_REG:x[0-9]+]], _InternalC@PAGE 261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str w0, {{\[}}[[ADRP_REG]], _InternalC@PAGEOFF] 262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 263*9880d681SAndroid Build Coastguard Workerdefine void @setInternalC(i32 %t) { 264*9880d681SAndroid Build Coastguard Workerentry: 265*9880d681SAndroid Build Coastguard Worker store i32 %t, i32* @InternalC, align 4 266*9880d681SAndroid Build Coastguard Worker ret void 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Worker; Now check other variant of loads/stores. 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker@D = common global i8 0, align 4 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker; LDRB does not support loading from a literal. 274*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGot and not AdrpLdrGotLdr for those. 275*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getD 276*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _D@GOTPAGE 278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _D@GOTPAGEOFF] 280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrb w0, {{\[}}[[LDRGOT_REG]]] 281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 282*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot [[ADRP_LABEL]], [[LDRGOT_LABEL]] 283*9880d681SAndroid Build Coastguard Workerdefine i8 @getD() { 284*9880d681SAndroid Build Coastguard Worker %res = load i8, i8* @D, align 4 285*9880d681SAndroid Build Coastguard Worker ret i8 %res 286*9880d681SAndroid Build Coastguard Worker} 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setD 289*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 290*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _D@GOTPAGE 291*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 292*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _D@GOTPAGEOFF] 293*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]: 294*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strb w0, {{\[}}[[LDRGOT_REG]]] 295*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 296*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]] 297*9880d681SAndroid Build Coastguard Workerdefine void @setD(i8 %t) { 298*9880d681SAndroid Build Coastguard Worker store i8 %t, i8* @D, align 4 299*9880d681SAndroid Build Coastguard Worker ret void 300*9880d681SAndroid Build Coastguard Worker} 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Worker; LDRSB supports loading from a literal. 303*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 304*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtD 305*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _D@GOTPAGE 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _D@GOTPAGEOFF] 309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsb w0, {{\[}}[[LDRGOT_REG]]] 311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 312*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 313*9880d681SAndroid Build Coastguard Workerdefine i32 @getSExtD() { 314*9880d681SAndroid Build Coastguard Worker %res = load i8, i8* @D, align 4 315*9880d681SAndroid Build Coastguard Worker %sextres = sext i8 %res to i32 316*9880d681SAndroid Build Coastguard Worker ret i32 %sextres 317*9880d681SAndroid Build Coastguard Worker} 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker; LDRSB supports loading from a literal. 320*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExt64D 322*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _D@GOTPAGE 324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _D@GOTPAGEOFF] 326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsb x0, {{\[}}[[LDRGOT_REG]]] 328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 329*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 330*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExt64D() { 331*9880d681SAndroid Build Coastguard Worker %res = load i8, i8* @D, align 4 332*9880d681SAndroid Build Coastguard Worker %sextres = sext i8 %res to i64 333*9880d681SAndroid Build Coastguard Worker ret i64 %sextres 334*9880d681SAndroid Build Coastguard Worker} 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker@E = common global i16 0, align 4 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker; LDRH does not support loading from a literal. 339*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGot and not AdrpLdrGotLdr for those. 340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getE 341*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 342*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _E@GOTPAGE 343*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _E@GOTPAGEOFF] 345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrh w0, {{\[}}[[LDRGOT_REG]]] 346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 347*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot [[ADRP_LABEL]], [[LDRGOT_LABEL]] 348*9880d681SAndroid Build Coastguard Workerdefine i16 @getE() { 349*9880d681SAndroid Build Coastguard Worker %res = load i16, i16* @E, align 4 350*9880d681SAndroid Build Coastguard Worker ret i16 %res 351*9880d681SAndroid Build Coastguard Worker} 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker; LDRSH supports loading from a literal. 354*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 355*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExtE 356*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 357*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _E@GOTPAGE 358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _E@GOTPAGEOFF] 360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 361*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsh w0, {{\[}}[[LDRGOT_REG]]] 362*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 363*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 364*9880d681SAndroid Build Coastguard Workerdefine i32 @getSExtE() { 365*9880d681SAndroid Build Coastguard Worker %res = load i16, i16* @E, align 4 366*9880d681SAndroid Build Coastguard Worker %sextres = sext i16 %res to i32 367*9880d681SAndroid Build Coastguard Worker ret i32 %sextres 368*9880d681SAndroid Build Coastguard Worker} 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setE 371*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 372*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _E@GOTPAGE 373*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 374*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _E@GOTPAGEOFF] 375*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]: 376*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strh w0, {{\[}}[[LDRGOT_REG]]] 377*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 378*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]] 379*9880d681SAndroid Build Coastguard Workerdefine void @setE(i16 %t) { 380*9880d681SAndroid Build Coastguard Worker store i16 %t, i16* @E, align 4 381*9880d681SAndroid Build Coastguard Worker ret void 382*9880d681SAndroid Build Coastguard Worker} 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker; LDRSH supports loading from a literal. 385*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 386*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getSExt64E 387*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 388*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _E@GOTPAGE 389*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _E@GOTPAGEOFF] 391*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 392*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldrsh x0, {{\[}}[[LDRGOT_REG]]] 393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 394*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 395*9880d681SAndroid Build Coastguard Workerdefine i64 @getSExt64E() { 396*9880d681SAndroid Build Coastguard Worker %res = load i16, i16* @E, align 4 397*9880d681SAndroid Build Coastguard Worker %sextres = sext i16 %res to i64 398*9880d681SAndroid Build Coastguard Worker ret i64 %sextres 399*9880d681SAndroid Build Coastguard Worker} 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Worker@F = common global i64 0, align 4 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Worker; LDR supports loading from a literal. 404*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 405*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getF 406*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 407*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _F@GOTPAGE 408*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 409*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _F@GOTPAGEOFF] 410*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr x0, {{\[}}[[LDRGOT_REG]]] 412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 413*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 414*9880d681SAndroid Build Coastguard Workerdefine i64 @getF() { 415*9880d681SAndroid Build Coastguard Worker %res = load i64, i64* @F, align 4 416*9880d681SAndroid Build Coastguard Worker ret i64 %res 417*9880d681SAndroid Build Coastguard Worker} 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setF 420*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 421*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _F@GOTPAGE 422*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 423*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _F@GOTPAGEOFF] 424*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]: 425*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str x0, {{\[}}[[LDRGOT_REG]]] 426*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 427*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]] 428*9880d681SAndroid Build Coastguard Workerdefine void @setF(i64 %t) { 429*9880d681SAndroid Build Coastguard Worker store i64 %t, i64* @F, align 4 430*9880d681SAndroid Build Coastguard Worker ret void 431*9880d681SAndroid Build Coastguard Worker} 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Worker@G = common global float 0.0, align 4 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard Worker; LDR float supports loading from a literal. 436*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 437*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getG 438*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 439*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _G@GOTPAGE 440*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 441*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _G@GOTPAGEOFF] 442*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr s0, {{\[}}[[LDRGOT_REG]]] 444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 445*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 446*9880d681SAndroid Build Coastguard Workerdefine float @getG() { 447*9880d681SAndroid Build Coastguard Worker %res = load float, float* @G, align 4 448*9880d681SAndroid Build Coastguard Worker ret float %res 449*9880d681SAndroid Build Coastguard Worker} 450*9880d681SAndroid Build Coastguard Worker 451*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setG 452*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 453*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _G@GOTPAGE 454*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 455*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _G@GOTPAGEOFF] 456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]: 457*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str s0, {{\[}}[[LDRGOT_REG]]] 458*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 459*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]] 460*9880d681SAndroid Build Coastguard Workerdefine void @setG(float %t) { 461*9880d681SAndroid Build Coastguard Worker store float %t, float* @G, align 4 462*9880d681SAndroid Build Coastguard Worker ret void 463*9880d681SAndroid Build Coastguard Worker} 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Worker@H = common global half 0.0, align 4 466*9880d681SAndroid Build Coastguard Worker 467*9880d681SAndroid Build Coastguard Worker; LDR half supports loading from a literal. 468*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 469*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getH 470*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 471*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _H@GOTPAGE 472*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 473*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _H@GOTPAGEOFF] 474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 475*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr h0, {{\[}}[[LDRGOT_REG]]] 476*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 477*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 478*9880d681SAndroid Build Coastguard Workerdefine half @getH() { 479*9880d681SAndroid Build Coastguard Worker %res = load half, half* @H, align 4 480*9880d681SAndroid Build Coastguard Worker ret half %res 481*9880d681SAndroid Build Coastguard Worker} 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setH 484*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 485*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _H@GOTPAGE 486*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 487*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _H@GOTPAGEOFF] 488*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]: 489*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, {{\[}}[[LDRGOT_REG]]] 490*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 491*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]] 492*9880d681SAndroid Build Coastguard Workerdefine void @setH(half %t) { 493*9880d681SAndroid Build Coastguard Worker store half %t, half* @H, align 4 494*9880d681SAndroid Build Coastguard Worker ret void 495*9880d681SAndroid Build Coastguard Worker} 496*9880d681SAndroid Build Coastguard Worker 497*9880d681SAndroid Build Coastguard Worker@I = common global double 0.0, align 4 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Worker; LDR double supports loading from a literal. 500*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 501*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getI 502*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 503*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _I@GOTPAGE 504*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 505*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _I@GOTPAGEOFF] 506*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 507*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr d0, {{\[}}[[LDRGOT_REG]]] 508*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 509*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 510*9880d681SAndroid Build Coastguard Workerdefine double @getI() { 511*9880d681SAndroid Build Coastguard Worker %res = load double, double* @I, align 4 512*9880d681SAndroid Build Coastguard Worker ret double %res 513*9880d681SAndroid Build Coastguard Worker} 514*9880d681SAndroid Build Coastguard Worker 515*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setI 516*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 517*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _I@GOTPAGE 518*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 519*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _I@GOTPAGEOFF] 520*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]: 521*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str d0, {{\[}}[[LDRGOT_REG]]] 522*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 523*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]] 524*9880d681SAndroid Build Coastguard Workerdefine void @setI(double %t) { 525*9880d681SAndroid Build Coastguard Worker store double %t, double* @I, align 4 526*9880d681SAndroid Build Coastguard Worker ret void 527*9880d681SAndroid Build Coastguard Worker} 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Worker@J = common global <2 x i32> <i32 0, i32 0>, align 4 530*9880d681SAndroid Build Coastguard Worker 531*9880d681SAndroid Build Coastguard Worker; LDR 64-bit vector supports loading from a literal. 532*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 533*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getJ 534*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 535*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _J@GOTPAGE 536*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 537*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _J@GOTPAGEOFF] 538*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 539*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr d0, {{\[}}[[LDRGOT_REG]]] 540*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 541*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 542*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @getJ() { 543*9880d681SAndroid Build Coastguard Worker %res = load <2 x i32>, <2 x i32>* @J, align 4 544*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %res 545*9880d681SAndroid Build Coastguard Worker} 546*9880d681SAndroid Build Coastguard Worker 547*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setJ 548*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 549*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _J@GOTPAGE 550*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 551*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _J@GOTPAGEOFF] 552*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]: 553*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str d0, {{\[}}[[LDRGOT_REG]]] 554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 555*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]] 556*9880d681SAndroid Build Coastguard Workerdefine void @setJ(<2 x i32> %t) { 557*9880d681SAndroid Build Coastguard Worker store <2 x i32> %t, <2 x i32>* @J, align 4 558*9880d681SAndroid Build Coastguard Worker ret void 559*9880d681SAndroid Build Coastguard Worker} 560*9880d681SAndroid Build Coastguard Worker 561*9880d681SAndroid Build Coastguard Worker@K = common global <4 x i32> <i32 0, i32 0, i32 0, i32 0>, align 4 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker; LDR 128-bit vector supports loading from a literal. 564*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 565*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getK 566*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 567*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _K@GOTPAGE 568*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 569*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _K@GOTPAGEOFF] 570*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 571*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr q0, {{\[}}[[LDRGOT_REG]]] 572*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 573*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 574*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @getK() { 575*9880d681SAndroid Build Coastguard Worker %res = load <4 x i32>, <4 x i32>* @K, align 4 576*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %res 577*9880d681SAndroid Build Coastguard Worker} 578*9880d681SAndroid Build Coastguard Worker 579*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setK 580*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 581*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _K@GOTPAGE 582*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 583*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _K@GOTPAGEOFF] 584*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[STR_LABEL:Lloh[0-9]+]]: 585*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str q0, {{\[}}[[LDRGOT_REG]]] 586*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 587*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotStr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[STR_LABEL]] 588*9880d681SAndroid Build Coastguard Workerdefine void @setK(<4 x i32> %t) { 589*9880d681SAndroid Build Coastguard Worker store <4 x i32> %t, <4 x i32>* @K, align 4 590*9880d681SAndroid Build Coastguard Worker ret void 591*9880d681SAndroid Build Coastguard Worker} 592*9880d681SAndroid Build Coastguard Worker 593*9880d681SAndroid Build Coastguard Worker@L = common global <1 x i8> <i8 0>, align 4 594*9880d681SAndroid Build Coastguard Worker 595*9880d681SAndroid Build Coastguard Worker; LDR 8-bit vector supports loading from a literal. 596*9880d681SAndroid Build Coastguard Worker; Make sure we emit AdrpLdrGotLdr for those. 597*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _getL 598*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 599*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _L@GOTPAGE 600*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 601*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _L@GOTPAGEOFF] 602*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDR_LABEL:Lloh[0-9]+]]: 603*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr b0, {{\[}}[[LDRGOT_REG]]] 604*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 605*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGotLdr [[ADRP_LABEL]], [[LDRGOT_LABEL]], [[LDR_LABEL]] 606*9880d681SAndroid Build Coastguard Workerdefine <1 x i8> @getL() { 607*9880d681SAndroid Build Coastguard Worker %res = load <1 x i8>, <1 x i8>* @L, align 4 608*9880d681SAndroid Build Coastguard Worker ret <1 x i8> %res 609*9880d681SAndroid Build Coastguard Worker} 610*9880d681SAndroid Build Coastguard Worker 611*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _setL 612*9880d681SAndroid Build Coastguard Worker; CHECK: [[ADRP_LABEL:Lloh[0-9]+]]: 613*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adrp [[ADRP_REG:x[0-9]+]], _L@GOTPAGE 614*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[LDRGOT_LABEL:Lloh[0-9]+]]: 615*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr [[LDRGOT_REG:x[0-9]+]], {{\[}}[[ADRP_REG]], _L@GOTPAGEOFF] 616*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; kill 617*9880d681SAndroid Build Coastguard Worker; Ultimately we should generate str b0, but right now, we match the vector 618*9880d681SAndroid Build Coastguard Worker; variant which does not allow to fold the immediate into the store. 619*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: st1.b { v0 }[0], {{\[}}[[LDRGOT_REG]]] 620*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 621*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot [[ADRP_LABEL]], [[LDRGOT_LABEL]] 622*9880d681SAndroid Build Coastguard Workerdefine void @setL(<1 x i8> %t) { 623*9880d681SAndroid Build Coastguard Worker store <1 x i8> %t, <1 x i8>* @L, align 4 624*9880d681SAndroid Build Coastguard Worker ret void 625*9880d681SAndroid Build Coastguard Worker} 626*9880d681SAndroid Build Coastguard Worker 627*9880d681SAndroid Build Coastguard Worker; Make sure we do not assert when we do not track 628*9880d681SAndroid Build Coastguard Worker; all the aliases of a tuple register. 629*9880d681SAndroid Build Coastguard Worker; Indeed the tuple register can be tracked because of 630*9880d681SAndroid Build Coastguard Worker; one of its element, but the other elements of the tuple 631*9880d681SAndroid Build Coastguard Worker; do not need to be tracked and we used to assert on that. 632*9880d681SAndroid Build Coastguard Worker; Note: The test case is fragile in the sense that we need 633*9880d681SAndroid Build Coastguard Worker; a tuple register to appear in the lowering. Thus, the target 634*9880d681SAndroid Build Coastguard Worker; cpu is required to have the problem reproduced. 635*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: _uninterestingSub 636*9880d681SAndroid Build Coastguard Worker; CHECK: adrp [[ADRP_REG:x[0-9]+]], [[CONSTPOOL:lCPI[0-9]+_[0-9]+]]@PAGE 637*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldr q[[IDX:[0-9]+]], {{\[}}[[ADRP_REG]], [[CONSTPOOL]]@PAGEOFF] 638*9880d681SAndroid Build Coastguard Worker; The tuple comes from the next instruction. 639*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: tbl.16b v{{[0-9]+}}, { v{{[0-9]+}}, v{{[0-9]+}} }, v[[IDX]] 640*9880d681SAndroid Build Coastguard Worker; CHECK: ret 641*9880d681SAndroid Build Coastguard Workerdefine void @uninterestingSub(i8* nocapture %row) #0 { 642*9880d681SAndroid Build Coastguard Worker %tmp = bitcast i8* %row to <16 x i8>* 643*9880d681SAndroid Build Coastguard Worker %tmp1 = load <16 x i8>, <16 x i8>* %tmp, align 16 644*9880d681SAndroid Build Coastguard Worker %vext43 = shufflevector <16 x i8> <i8 undef, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>, <16 x i8> %tmp1, <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16> 645*9880d681SAndroid Build Coastguard Worker %add.i.414 = add <16 x i8> zeroinitializer, %vext43 646*9880d681SAndroid Build Coastguard Worker store <16 x i8> %add.i.414, <16 x i8>* %tmp, align 16 647*9880d681SAndroid Build Coastguard Worker %add.ptr51 = getelementptr inbounds i8, i8* %row, i64 16 648*9880d681SAndroid Build Coastguard Worker %tmp2 = bitcast i8* %add.ptr51 to <16 x i8>* 649*9880d681SAndroid Build Coastguard Worker %tmp3 = load <16 x i8>, <16 x i8>* %tmp2, align 16 650*9880d681SAndroid Build Coastguard Worker %tmp4 = bitcast i8* undef to <16 x i8>* 651*9880d681SAndroid Build Coastguard Worker %tmp5 = load <16 x i8>, <16 x i8>* %tmp4, align 16 652*9880d681SAndroid Build Coastguard Worker %vext157 = shufflevector <16 x i8> %tmp3, <16 x i8> %tmp5, <16 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16> 653*9880d681SAndroid Build Coastguard Worker %add.i.402 = add <16 x i8> zeroinitializer, %vext157 654*9880d681SAndroid Build Coastguard Worker store <16 x i8> %add.i.402, <16 x i8>* %tmp4, align 16 655*9880d681SAndroid Build Coastguard Worker ret void 656*9880d681SAndroid Build Coastguard Worker} 657*9880d681SAndroid Build Coastguard Worker 658*9880d681SAndroid Build Coastguard Worker@.str.89 = external unnamed_addr constant [12 x i8], align 1 659*9880d681SAndroid Build Coastguard Worker@.str.90 = external unnamed_addr constant [5 x i8], align 1 660*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_r274582 661*9880d681SAndroid Build Coastguard Workerdefine void @test_r274582() { 662*9880d681SAndroid Build Coastguard Workerentry: 663*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then.i, label %if.end.i 664*9880d681SAndroid Build Coastguard Workerif.then.i: 665*9880d681SAndroid Build Coastguard Worker ret void 666*9880d681SAndroid Build Coastguard Workerif.end.i: 667*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpAdrp Lloh91, Lloh93 668*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdr Lloh91, Lloh92 669*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot Lloh93, Lloh95 670*9880d681SAndroid Build Coastguard Worker; CHECK: .loh AdrpLdrGot Lloh94, Lloh96 671*9880d681SAndroid Build Coastguard Worker %mul.i.i.i = fmul double undef, 1.000000e-06 672*9880d681SAndroid Build Coastguard Worker %add.i.i.i = fadd double undef, %mul.i.i.i 673*9880d681SAndroid Build Coastguard Worker %sub.i.i = fsub double %add.i.i.i, undef 674*9880d681SAndroid Build Coastguard Worker call void (i8*, ...) @callee(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.89, i64 0, i64 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.90, i64 0, i64 0), double %sub.i.i) 675*9880d681SAndroid Build Coastguard Worker unreachable 676*9880d681SAndroid Build Coastguard Worker} 677*9880d681SAndroid Build Coastguard Workerdeclare void @callee(i8* nocapture readonly, ...) 678*9880d681SAndroid Build Coastguard Worker 679*9880d681SAndroid Build Coastguard Workerattributes #0 = { "target-cpu"="cyclone" } 680