187 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; 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-SMALLCM645; 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-LARGECM649 10@ThreadLocalVarInit = thread_local(localexec) global i64 1, align 811@VarInit = local_unnamed_addr global i64 87, align 812@IThreadLocalVarInit = internal thread_local(localexec) global i64 1, align 813declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #114%struct.anon = type { i64 }15@ThreadLocalStruct = thread_local(localexec) global %struct.anon zeroinitializer, align 116@d = thread_local(localexec) global [87 x i64] zeroinitializer, align 817 18define nonnull ptr @AddrTest1() local_unnamed_addr #0 {19; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: AddrTest1:20; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry21; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, d[TL]@le(r13)22; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr23;24; SMALL-LOCAL-EXEC-LARGECM64-LABEL: AddrTest1:25; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry26; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, d[TL]@le(r13)27; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr28entry:29 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @d)30 ret ptr %031}32 33define i64 @testUnaligned() {34; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: testUnaligned:35; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry36; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, ThreadLocalStruct[TL]@le(r13)37; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r3, 0(r3)38; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr39;40; SMALL-LOCAL-EXEC-LARGECM64-LABEL: testUnaligned:41; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry42; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, ThreadLocalStruct[TL]@le(r13)43; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, 0(r3)44; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr45entry:46 %0 = call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @ThreadLocalStruct)47 %x = getelementptr inbounds %struct.anon, ptr %0, i32 0, i32 048 %1 = load i64, ptr %x, align 149 ret i64 %150}51 52define void @storeITLInit(i64 noundef %x) {53; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeITLInit:54; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry55; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r3, IThreadLocalVarInit[TL]@le(r13)56; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr57;58; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeITLInit:59; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry60; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r3, IThreadLocalVarInit[TL]@le(r13)61; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr62entry:63 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)64 store i64 %x, ptr %0, align 865 ret void66}67 68define void @storeTLInit(i64 noundef %x) {69; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeTLInit:70; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry71; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r3, ThreadLocalVarInit[TL]@le(r13)72; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr73;74; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeTLInit:75; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry76; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r3, ThreadLocalVarInit[TL]@le(r13)77; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr78entry:79 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)80 store i64 %x, ptr %0, align 881 ret void82}83 84define i64 @loadITLInit() {85; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadITLInit:86; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry87; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r3, IThreadLocalVarInit[TL]@le(r13)88; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr89;90; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadITLInit:91; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry92; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, IThreadLocalVarInit[TL]@le(r13)93; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr94entry:95 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)96 %1 = load i64, ptr %0, align 897 ret i64 %198}99 100define i64 @loadITLInit2() {101; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadITLInit2:102; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry103; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, L..C0(r2) # @VarInit104; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r3, IThreadLocalVarInit[TL]@le(r13)105; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, 0(r4)106; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: add r3, r4, r3107; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr108;109; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadITLInit2:110; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry111; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addis r4, L..C0@u(r2)112; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, IThreadLocalVarInit[TL]@le(r13)113; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r4, L..C0@l(r4)114; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r4, 0(r4)115; SMALL-LOCAL-EXEC-LARGECM64-NEXT: add r3, r4, r3116; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr117entry:118 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)119 %1 = load i64, ptr %0, align 8120 %2 = load i64, ptr @VarInit, align 8121 %add = add nsw i64 %2, %1122 ret i64 %add123}124 125define i64 @loadTLInit() {126; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadTLInit:127; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry128; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r3, ThreadLocalVarInit[TL]@le(r13)129; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr130;131; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadTLInit:132; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry133; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, ThreadLocalVarInit[TL]@le(r13)134; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr135entry:136 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)137 %1 = load i64, ptr %0, align 8138 ret i64 %1139}140 141define i64 @loadTLInit2() {142; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadTLInit2:143; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry144; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, L..C0(r2) # @VarInit145; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r3, ThreadLocalVarInit[TL]@le(r13)146; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, 0(r4)147; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: add r3, r4, r3148; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr149;150; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadTLInit2:151; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry152; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addis r4, L..C0@u(r2)153; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, ThreadLocalVarInit[TL]@le(r13)154; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r4, L..C0@l(r4)155; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r4, 0(r4)156; SMALL-LOCAL-EXEC-LARGECM64-NEXT: add r3, r4, r3157; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr158entry:159 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)160 %1 = load i64, ptr %0, align 8161 %2 = load i64, ptr @VarInit, align 8162 %add = add nsw i64 %2, %1163 ret i64 %add164}165 166define void @loadStore1(i64 noundef %x) {167; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadStore1:168; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry169; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r3, IThreadLocalVarInit[TL]@le(r13)170; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: addi r3, r3, 9171; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r3, IThreadLocalVarInit[TL]@le(r13)172; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr173;174; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadStore1:175; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry176; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, IThreadLocalVarInit[TL]@le(r13)177; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addi r3, r3, 9178; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r3, IThreadLocalVarInit[TL]@le(r13)179; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr180entry:181 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)182 %1 = load i64, ptr %0, align 8183 %add = add nsw i64 %1, 9184 store i64 %add, ptr %0, align 8185 ret void186}187