12a509215SAmy Kwan; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 22a509215SAmy Kwan; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \ 32a509215SAmy Kwan; RUN: -mtriple powerpc64-ibm-aix-xcoff -mattr=+aix-small-local-exec-tls < %s \ 42a509215SAmy Kwan; RUN: | FileCheck %s --check-prefix=SMALL-LOCAL-EXEC-SMALLCM64 52a509215SAmy Kwan; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \ 62a509215SAmy Kwan; RUN: -mtriple powerpc64-ibm-aix-xcoff --code-model=large \ 72a509215SAmy Kwan; RUN: -mattr=+aix-small-local-exec-tls < %s | FileCheck %s \ 82a509215SAmy Kwan; RUN: --check-prefix=SMALL-LOCAL-EXEC-LARGECM64 92a509215SAmy Kwan 102a509215SAmy Kwan; Test disassembly of object. 112a509215SAmy Kwan; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=+aix-small-local-exec-tls \ 122a509215SAmy Kwan; RUN: -mtriple powerpc64-ibm-aix-xcoff -xcoff-traceback-table=false \ 132a509215SAmy Kwan; RUN: --code-model=large -filetype=obj -o %t.o < %s 14*90e8dc0fSstephenpeckham; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS %s 152a509215SAmy Kwan 162a509215SAmy Kwan@mySmallLocalExecTLS6 = external thread_local(localexec) global [60 x i64], align 8 172a509215SAmy Kwan@mySmallLocalExecTLS2 = thread_local(localexec) global [3000 x i64] zeroinitializer, align 8 182a509215SAmy Kwan@MyTLSGDVar = thread_local global [800 x i64] zeroinitializer, align 8 192a509215SAmy Kwan@mySmallLocalExecTLS3 = thread_local(localexec) global [3000 x i64] zeroinitializer, align 8 202a509215SAmy Kwan@mySmallLocalExecTLS4 = thread_local(localexec) global [3000 x i64] zeroinitializer, align 8 212a509215SAmy Kwan@mySmallLocalExecTLS5 = thread_local(localexec) global [3000 x i64] zeroinitializer, align 8 222a509215SAmy Kwan@mySmallLocalExecTLS = thread_local(localexec) local_unnamed_addr global [7800 x i64] zeroinitializer, align 8 232a509215SAmy Kwandeclare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #1 242a509215SAmy Kwan 252a509215SAmy Kwan; All accesses use a "faster" local-exec sequence directly off the thread pointer. 262a509215SAmy Kwandefine i64 @StoreLargeAccess1() { 272a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: StoreLargeAccess1: 282a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry 292a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: mflr r0 302a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stdu r1, -48(r1) 312a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 212 322a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 203 332a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r0, 64(r1) 342a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r3, mySmallLocalExecTLS6[UL]@le+424(r13) 352a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r4, mySmallLocalExecTLS2[TL]@le+1200(r13) 362a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tlsgdm) @MyTLSGDVar 372a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, L..C1(r2) # target-flags(ppc-tlsgd) @MyTLSGDVar 382a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: bla .__tls_get_addr[PR] 392a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 44 402a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r4, 440(r3) 412a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 6 422a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 100 432a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r3, mySmallLocalExecTLS3[TL]@le+2000(r13) 442a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 882 452a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r4, (mySmallLocalExecTLS4[TL]@le+6800)-65536(r13) 462a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r3, (mySmallLocalExecTLS5[TL]@le+8400)-65536(r13) 472a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 1191 482a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: addi r1, r1, 48 492a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r0, 16(r1) 502a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: mtlr r0 512a509215SAmy Kwan; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr 522a509215SAmy Kwan; 532a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-LABEL: StoreLargeAccess1: 542a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry 552a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: mflr r0 562a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stdu r1, -48(r1) 572a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 212 582a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r0, 64(r1) 592a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addis r4, L..C0@u(r2) 602a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r4, L..C0@l(r4) 612a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r3, mySmallLocalExecTLS6[UL]@le+424(r13) 622a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 203 632a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r3, mySmallLocalExecTLS2[TL]@le+1200(r13) 642a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addis r3, L..C1@u(r2) 652a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, L..C1@l(r3) 662a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: bla .__tls_get_addr[PR] 672a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r4, 44 682a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r4, 440(r3) 692a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 6 702a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r4, 100 712a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r3, mySmallLocalExecTLS3[TL]@le+2000(r13) 722a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 882 732a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r4, (mySmallLocalExecTLS4[TL]@le+6800)-65536(r13) 742a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r3, (mySmallLocalExecTLS5[TL]@le+8400)-65536(r13) 752a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 1191 762a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addi r1, r1, 48 772a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r0, 16(r1) 782a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: mtlr r0 792a509215SAmy Kwan; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr 802a509215SAmy Kwanentry: 812a509215SAmy Kwan %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @mySmallLocalExecTLS6) 822a509215SAmy Kwan %arrayidx = getelementptr inbounds [60 x i64], ptr %0, i64 0, i64 53 832a509215SAmy Kwan store i64 212, ptr %arrayidx, align 8 842a509215SAmy Kwan %1 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @mySmallLocalExecTLS2) 852a509215SAmy Kwan %arrayidx1 = getelementptr inbounds [3000 x i64], ptr %1, i64 0, i64 150 862a509215SAmy Kwan store i64 203, ptr %arrayidx1, align 8 872a509215SAmy Kwan %2 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @MyTLSGDVar) 882a509215SAmy Kwan %arrayidx2 = getelementptr inbounds [800 x i64], ptr %2, i64 0, i64 55 892a509215SAmy Kwan store i64 44, ptr %arrayidx2, align 8 902a509215SAmy Kwan %3 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @mySmallLocalExecTLS3) 912a509215SAmy Kwan %arrayidx3 = getelementptr inbounds [3000 x i64], ptr %3, i64 0, i64 250 922a509215SAmy Kwan store i64 6, ptr %arrayidx3, align 8 932a509215SAmy Kwan %4 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @mySmallLocalExecTLS4) 942a509215SAmy Kwan %arrayidx4 = getelementptr inbounds [3000 x i64], ptr %4, i64 0, i64 850 952a509215SAmy Kwan store i64 100, ptr %arrayidx4, align 8 962a509215SAmy Kwan %5 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @mySmallLocalExecTLS5) 972a509215SAmy Kwan %arrayidx5 = getelementptr inbounds [3000 x i64], ptr %5, i64 0, i64 1050 982a509215SAmy Kwan store i64 882, ptr %arrayidx5, align 8 992a509215SAmy Kwan %6 = load i64, ptr %arrayidx1, align 8 1002a509215SAmy Kwan %7 = load i64, ptr %arrayidx3, align 8 1012a509215SAmy Kwan %8 = load i64, ptr %arrayidx4, align 8 1022a509215SAmy Kwan %add = add i64 %6, 882 1032a509215SAmy Kwan %add9 = add i64 %add, %7 1042a509215SAmy Kwan %add11 = add i64 %add9, %8 1052a509215SAmy Kwan ret i64 %add11 1062a509215SAmy Kwan} 1072a509215SAmy Kwan 108*90e8dc0fSstephenpeckham; DIS: 0000000000000000 (idx: [[#NFA+7]]) .StoreLargeAccess1: 1092a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} mflr 0 1102a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stdu 1, -48(1) 1112a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 212 1122a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} std 0, 64(1) 1132a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} addis 4, 2, 0 114*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: [[#NFA+13]]) MyTLSGDVar[TE] 1152a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 4, 0(4) 116*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: [[#NFA+13]]) MyTLSGDVar[TE] 1172a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} std 3, 424(13) 118*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+1]]) mySmallLocalExecTLS6[UL] 1192a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 203 1202a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} std 3, 1200(13) 121*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL] 1222a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} addis 3, 2, 0 123*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: [[#NFA+15]]) .MyTLSGDVar[TE] 1242a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 3, 8(3) 125*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: [[#NFA+15]]) .MyTLSGDVar[TE] 1262a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} bla 0 127*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR]]: R_RBA (idx: [[#NFA+3]]) .__tls_get_addr[PR] 1282a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 44 1292a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} std 4, 440(3) 1302a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 6 1312a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 100 1322a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} std 3, 32400(13) 133*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+21]]) mySmallLocalExecTLS3[TL] 1342a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 882 1352a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} std 4, -4336(13) 136*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+23]]) mySmallLocalExecTLS4[TL] 1372a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} std 3, 21264(13) 138*90e8dc0fSstephenpeckham; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+25]]) mySmallLocalExecTLS5[TL] 1392a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 1191 1402a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} addi 1, 1, 48 1412a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 0, 16(1) 1422a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} mtlr 0 1432a509215SAmy Kwan; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} blr 1442a509215SAmy Kwan 1452a509215SAmy Kwan; DIS: Disassembly of section .data: 146*90e8dc0fSstephenpeckham; DIS: 0000000000000068 (idx: [[#NFA+9]]) StoreLargeAccess1[DS]: 1472a509215SAmy Kwan; DIS-NEXT: 68: 00 00 00 00 148*90e8dc0fSstephenpeckham; DIS-NEXT: 0000000000000068: R_POS (idx: [[#NFA+7]]) .StoreLargeAccess1 1492a509215SAmy Kwan; DIS-NEXT: 6c: 00 00 00 00 1502a509215SAmy Kwan; DIS-NEXT: 70: 00 00 00 00 151*90e8dc0fSstephenpeckham; DIS-NEXT: 0000000000000070: R_POS (idx: [[#NFA+11]]) TOC[TC0] 1522a509215SAmy Kwan; DIS-NEXT: 74: 00 00 00 80 1532a509215SAmy Kwan 1542a509215SAmy Kwan; DIS: Disassembly of section .tdata: 155*90e8dc0fSstephenpeckham; DIS: 0000000000000000 (idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL]: 156*90e8dc0fSstephenpeckham; DIS: 0000000000005dc0 (idx: [[#NFA+19]]) MyTLSGDVar[TL]: 157*90e8dc0fSstephenpeckham; DIS: 00000000000076c0 (idx: [[#NFA+21]]) mySmallLocalExecTLS3[TL]: 158*90e8dc0fSstephenpeckham; DIS: 000000000000d480 (idx: [[#NFA+23]]) mySmallLocalExecTLS4[TL]: 159*90e8dc0fSstephenpeckham; DIS: 0000000000013240 (idx: [[#NFA+25]]) mySmallLocalExecTLS5[TL]: 160*90e8dc0fSstephenpeckham; DIS: 0000000000019000 (idx: [[#NFA+27]]) mySmallLocalExecTLS[TL]: 161