1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \ 3; RUN: -mtriple powerpc64-ibm-aix-xcoff -mattr=+aix-small-local-exec-tls < %s \ 4; RUN: | FileCheck %s --check-prefix=SMALL-LOCAL-EXEC-SMALLCM64 5; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \ 6; RUN: -mtriple powerpc64-ibm-aix-xcoff --code-model=large \ 7; RUN: -mattr=+aix-small-local-exec-tls < %s | FileCheck %s \ 8; RUN: --check-prefix=SMALL-LOCAL-EXEC-LARGECM64 9 10; Test disassembly of object. 11; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=+aix-small-local-exec-tls \ 12; RUN: -mtriple powerpc64-ibm-aix-xcoff -xcoff-traceback-table=false \ 13; RUN: --code-model=large -filetype=obj -o %t.o < %s 14; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS %s 15 16@mySmallLocalExecTLSv1 = thread_local(localexec) global [8187 x i32] zeroinitializer, align 4 17@mySmallLocalExecTLS2 = thread_local(localexec) global [4000 x i32] zeroinitializer, align 4 18@mySmallLocalExecTLS3 = thread_local(localexec) global [4000 x i32] zeroinitializer, align 4 19@mySmallLocalExecTLS4 = thread_local(localexec) global [4000 x i32] zeroinitializer, align 4 20@mySmallLocalExecTLS5 = thread_local(localexec) global [4000 x i32] zeroinitializer, align 4 21@mySmallLocalExecTLSv2 = thread_local(localexec) global [9000 x i32] zeroinitializer, align 4 22declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #1 23 24; All accesses use a "faster" local-exec sequence directly off the thread pointer. 25define signext i32 @StoreArrays1() { 26; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: StoreArrays1: 27; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry 28; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 1 29; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 4 30; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, mySmallLocalExecTLSv1[TL]@le(r13) 31; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 2 32; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r4, mySmallLocalExecTLSv1[TL]@le+24(r13) 33; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13) 34; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13) 35; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 3 36; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13) 37; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 88 38; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13) 39; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 102 40; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr 41; 42; SMALL-LOCAL-EXEC-LARGECM64-LABEL: StoreArrays1: 43; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry 44; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 1 45; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r4, 4 46; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, mySmallLocalExecTLSv1[TL]@le(r13) 47; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 2 48; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, mySmallLocalExecTLSv1[TL]@le+24(r13) 49; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13) 50; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13) 51; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 3 52; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13) 53; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 88 54; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13) 55; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 102 56; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr 57entry: 58 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLSv1) 59 store i32 1, ptr %0, align 4 60 %arrayidx1 = getelementptr inbounds [8187 x i32], ptr %0, i64 0, i64 6 61 store i32 4, ptr %arrayidx1, align 4 62 %1 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS2) 63 %arrayidx2 = getelementptr inbounds [4000 x i32], ptr %1, i64 0, i64 80 64 store i32 2, ptr %arrayidx2, align 4 65 %2 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS3) 66 %arrayidx3 = getelementptr inbounds [4000 x i32], ptr %2, i64 0, i64 81 67 store i32 3, ptr %arrayidx3, align 4 68 %3 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS4) 69 %arrayidx4 = getelementptr inbounds [4000 x i32], ptr %3, i64 0, i64 82 70 store i32 4, ptr %arrayidx4, align 4 71 %4 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS5) 72 %arrayidx5 = getelementptr inbounds [4000 x i32], ptr %4, i64 0, i64 83 73 store i32 88, ptr %arrayidx5, align 4 74 %5 = load i32, ptr %0, align 4 75 %6 = load i32, ptr %arrayidx1, align 4 76 %7 = load i32, ptr %arrayidx2, align 4 77 %8 = load i32, ptr %arrayidx3, align 4 78 %9 = load i32, ptr %arrayidx4, align 4 79 %add = add i32 %5, 88 80 %add9 = add i32 %add, %6 81 %add11 = add i32 %add9, %7 82 %add13 = add i32 %add11, %8 83 %add15 = add i32 %add13, %9 84 ret i32 %add15 85} 86 87; Example of one access using the regular local-exec access from the TOC. 88define signext i32 @StoreArrays2() { 89; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: StoreArrays2: 90; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry 91; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 2 92; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 1 93; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r4, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13) 94; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 3 95; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r4, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13) 96; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, L..C0(r2) # target-flags(ppc-tprel) @mySmallLocalExecTLSv2 97; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: add r4, r13, r4 98; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, 0(r4) 99; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 4 100; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, 24(r4) 101; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r4, 88 102; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13) 103; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: li r3, 102 104; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r4, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13) 105; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr 106; 107; SMALL-LOCAL-EXEC-LARGECM64-LABEL: StoreArrays2: 108; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry 109; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 2 110; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r4, 3 111; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS2[TL]@le+320)-65536(r13) 112; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addis r3, L..C0@u(r2) 113; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, L..C0@l(r3) 114; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, (mySmallLocalExecTLS3[TL]@le+324)-65536(r13) 115; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r4, 1 116; SMALL-LOCAL-EXEC-LARGECM64-NEXT: add r3, r13, r3 117; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, 0(r3) 118; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r4, 4 119; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, 24(r3) 120; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 88 121; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r4, (mySmallLocalExecTLS4[TL]@le+328)-65536(r13) 122; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, (mySmallLocalExecTLS5[TL]@le+332)-65536(r13) 123; SMALL-LOCAL-EXEC-LARGECM64-NEXT: li r3, 102 124; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr 125entry: 126 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLSv2) 127 store i32 1, ptr %0, align 4 128 %arrayidx1 = getelementptr inbounds [9000 x i32], ptr %0, i64 0, i64 6 129 store i32 4, ptr %arrayidx1, align 4 130 %1 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS2) 131 %arrayidx2 = getelementptr inbounds [4000 x i32], ptr %1, i64 0, i64 80 132 store i32 2, ptr %arrayidx2, align 4 133 %2 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS3) 134 %arrayidx3 = getelementptr inbounds [4000 x i32], ptr %2, i64 0, i64 81 135 store i32 3, ptr %arrayidx3, align 4 136 %3 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS4) 137 %arrayidx4 = getelementptr inbounds [4000 x i32], ptr %3, i64 0, i64 82 138 store i32 4, ptr %arrayidx4, align 4 139 %4 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @mySmallLocalExecTLS5) 140 %arrayidx5 = getelementptr inbounds [4000 x i32], ptr %4, i64 0, i64 83 141 store i32 88, ptr %arrayidx5, align 4 142 %5 = load i32, ptr %0, align 4 143 %6 = load i32, ptr %arrayidx1, align 4 144 %7 = load i32, ptr %arrayidx2, align 4 145 %8 = load i32, ptr %arrayidx3, align 4 146 %9 = load i32, ptr %arrayidx4, align 4 147 %add = add i32 %5, 88 148 %add9 = add i32 %add, %6 149 %add11 = add i32 %add9, %7 150 %add13 = add i32 %add11, %8 151 %add15 = add i32 %add13, %9 152 ret i32 %add15 153} 154 155; DIS: file format aix5coff64-rs6000 156; DIS: Disassembly of section .text: 157; DIS: 0000000000000000 (idx: [[#NFA+3]]) .StoreArrays1: 158; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 1 159; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 4 160; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 0(13) 161; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+15]]) mySmallLocalExecTLSv1[TL] 162; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 2 163; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 24(13) 164; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+15]]) mySmallLocalExecTLSv1[TL] 165; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, -460(13) 166; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL] 167; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, -32468(13) 168; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL] 169; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 3 170; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, -16464(13) 171; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL] 172; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 88 173; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 15544(13) 174; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+23]]) mySmallLocalExecTLS5[TL] 175; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 102 176; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} blr 177 178; DIS: 0000000000000040 (idx: [[#NFA+5]]) .StoreArrays2: 179; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 2 180; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 3 181; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, -32468(13) 182; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL] 183; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} addis 3, 2, 0 184; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCU (idx: [[#NFA+13]]) mySmallLocalExecTLSv2[TE] 185; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} ld 3, 0(3) 186; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TOCL (idx: [[#NFA+13]]) mySmallLocalExecTLSv2[TE] 187; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, -16464(13) 188; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL] 189; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 1 190; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} add 3, 13, 3 191; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 0(3) 192; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 4, 4 193; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, 24(3) 194; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 88 195; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 4, -460(13) 196; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL] 197; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} stw 3, 15544(13) 198; DIS-NEXT: {{0*}}[[#ADDR + 2]]: R_TLS_LE (idx: [[#NFA+23]]) mySmallLocalExecTLS5[TL] 199; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} li 3, 102 200; DIS-NEXT: [[#%x, ADDR:]]: {{.*}} blr 201 202; DIS: Disassembly of section .data: 203; DIS: 0000000000000080 (idx: [[#NFA+7]]) StoreArrays1[DS]: 204; DIS-NEXT: 80: 00 00 00 00 205; DIS-NEXT: 0000000000000080: R_POS (idx: [[#NFA+3]]) .StoreArrays1 206; DIS-NEXT: 84: 00 00 00 00 207; DIS-NEXT: 88: 00 00 00 00 208; DIS-NEXT: 0000000000000088: R_POS (idx: [[#NFA+11]]) TOC[TC0] 209; DIS-NEXT: 8c: 00 00 00 b0 210 211; DIS: 0000000000000098 (idx: [[#NFA+9]]) StoreArrays2[DS]: 212; DIS-NEXT: 98: 00 00 00 00 213; DIS-NEXT: 0000000000000098: R_POS (idx: [[#NFA+5]]) .StoreArrays2 214; DIS-NEXT: 9c: 00 00 00 40 215; DIS-NEXT: a0: 00 00 00 00 216; DIS-NEXT: 00000000000000a0: R_POS (idx: [[#NFA+11]]) TOC[TC0] 217; DIS-NEXT: a4: 00 00 00 b0 218 219; DIS: 00000000000000b0 (idx: [[#NFA+13]]) mySmallLocalExecTLSv2[TE]: 220; DIS-NEXT: b0: 00 00 00 00 221; DIS-NEXT: 00000000000000b0: R_TLS_LE (idx: [[#NFA+25]]) mySmallLocalExecTLSv2[TL] 222; DIS-NEXT: b4: 00 01 79 ec 223 224; DIS: Disassembly of section .tdata: 225; DIS: 0000000000000000 (idx: [[#NFA+15]]) mySmallLocalExecTLSv1[TL]: 226; DIS: 0000000000007fec (idx: [[#NFA+17]]) mySmallLocalExecTLS2[TL]: 227; DIS: 000000000000be6c (idx: [[#NFA+19]]) mySmallLocalExecTLS3[TL]: 228; DIS: 000000000000fcec (idx: [[#NFA+21]]) mySmallLocalExecTLS4[TL]: 229; DIS: 0000000000013b6c (idx: [[#NFA+23]]) mySmallLocalExecTLS5[TL]: 230; DIS: 00000000000179ec (idx: [[#NFA+25]]) mySmallLocalExecTLSv2[TL]: 231