193 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 i32 1, align 411@VarInit = local_unnamed_addr global i32 87, align 412@IThreadLocalVarInit = internal thread_local(localexec) global i32 1, align 413declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #114%struct.anon = type { i32 }15@ThreadLocalStruct = thread_local(localexec) global %struct.anon zeroinitializer, align 116@a = thread_local(localexec) global [87 x i32] zeroinitializer, align 417 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, a[TL]@le+12(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, a[TL]@le+12(r13)27; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr28entry:29 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @a)30 %arrayidx = getelementptr inbounds [87 x i32], ptr %0, i64 0, i64 331 ret ptr %arrayidx32}33 34define signext i32 @testUnaligned() {35; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: testUnaligned:36; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry37; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, ThreadLocalStruct[TL]@le(r13)38; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwa r3, 0(r3)39; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr40;41; SMALL-LOCAL-EXEC-LARGECM64-LABEL: testUnaligned:42; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry43; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, ThreadLocalStruct[TL]@le(r13)44; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwa r3, 0(r3)45; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr46entry:47 %0 = call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @ThreadLocalStruct)48 %x = getelementptr inbounds %struct.anon, ptr %0, i32 0, i32 049 %1 = load i32, ptr %x, align 150 ret i32 %151}52 53define void @storeITLInit(i32 noundef signext %x) {54; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeITLInit:55; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry56; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, IThreadLocalVarInit[TL]@le(r13)57; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr58;59; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeITLInit:60; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry61; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, IThreadLocalVarInit[TL]@le(r13)62; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr63entry:64 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)65 store i32 %x, ptr %0, align 466 ret void67}68 69define void @storeTLInit(i32 noundef signext %x) {70; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeTLInit:71; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry72; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, ThreadLocalVarInit[TL]@le(r13)73; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr74;75; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeTLInit:76; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry77; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, ThreadLocalVarInit[TL]@le(r13)78; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr79entry:80 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)81 store i32 %x, ptr %0, align 482 ret void83}84 85define signext i32 @loadITLInit() {86; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadITLInit:87; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry88; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwa r3, IThreadLocalVarInit[TL]@le(r13)89; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr90;91; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadITLInit:92; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry93; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwa r3, IThreadLocalVarInit[TL]@le(r13)94; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr95entry:96 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)97 %1 = load i32, ptr %0, align 498 ret i32 %199}100 101define signext i32 @loadITLInit2() {102; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadITLInit2:103; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry104; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, L..C0(r2) # @VarInit105; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwz r3, IThreadLocalVarInit[TL]@le(r13)106; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwz r4, 0(r4)107; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: add r3, r4, r3108; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: extsw r3, r3109; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr110;111; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadITLInit2:112; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry113; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addis r4, L..C0@u(r2)114; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwz r3, IThreadLocalVarInit[TL]@le(r13)115; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r4, L..C0@l(r4)116; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwz r4, 0(r4)117; SMALL-LOCAL-EXEC-LARGECM64-NEXT: add r3, r4, r3118; SMALL-LOCAL-EXEC-LARGECM64-NEXT: extsw r3, r3119; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr120entry:121 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)122 %1 = load i32, ptr %0, align 4123 %2 = load i32, ptr @VarInit, align 4124 %add = add nsw i32 %2, %1125 ret i32 %add126}127 128define signext i32 @loadTLInit() {129; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadTLInit:130; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry131; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwa r3, ThreadLocalVarInit[TL]@le(r13)132; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr133;134; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadTLInit:135; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry136; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwa r3, ThreadLocalVarInit[TL]@le(r13)137; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr138entry:139 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)140 %1 = load i32, ptr %0, align 4141 ret i32 %1142}143 144define signext i32 @loadTLInit2() {145; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadTLInit2:146; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry147; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r4, L..C0(r2) # @VarInit148; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwz r3, ThreadLocalVarInit[TL]@le(r13)149; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwz r4, 0(r4)150; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: add r3, r4, r3151; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: extsw r3, r3152; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr153;154; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadTLInit2:155; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry156; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addis r4, L..C0@u(r2)157; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwz r3, ThreadLocalVarInit[TL]@le(r13)158; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r4, L..C0@l(r4)159; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwz r4, 0(r4)160; SMALL-LOCAL-EXEC-LARGECM64-NEXT: add r3, r4, r3161; SMALL-LOCAL-EXEC-LARGECM64-NEXT: extsw r3, r3162; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr163entry:164 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)165 %1 = load i32, ptr %0, align 4166 %2 = load i32, ptr @VarInit, align 4167 %add = add nsw i32 %2, %1168 ret i32 %add169}170 171define void @loadStore1(i32 noundef signext %x) {172; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadStore1:173; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry174; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwz r3, IThreadLocalVarInit[TL]@le(r13)175; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: addi r3, r3, 9176; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, IThreadLocalVarInit[TL]@le(r13)177; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr178;179; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadStore1:180; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry181; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwz r3, IThreadLocalVarInit[TL]@le(r13)182; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addi r3, r3, 9183; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, IThreadLocalVarInit[TL]@le(r13)184; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr185entry:186 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)187 %1 = load i32, ptr %0, align 4188 %add = add nsw i32 %1, 9189 store i32 %add, ptr %0, align 4190 ret void191}192 193