223 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \3; RUN: -mtriple powerpc64-ibm-aix-xcoff -mattr=-aix-small-local-exec-tls \4; RUN: < %s | FileCheck %s --check-prefixes=COMMONCM,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 | \8; RUN: FileCheck %s --check-prefixes=COMMONCM,LARGECM649 10; Test that the 'aix-small-tls' global variable attribute generates the11; optimized small-local-exec TLS sequence. Global variables without this12; attribute should still generate a TOC-based local-exec access sequence.13 14declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)15 16@a = thread_local(localexec) global [87 x i8] zeroinitializer, align 1 #017@a_noattr = thread_local(localexec) global [87 x i8] zeroinitializer, align 118@b = thread_local(localexec) global [87 x i16] zeroinitializer, align 2 #019@b_noattr = thread_local(localexec) global [87 x i16] zeroinitializer, align 220@c = thread_local(localexec) global [87 x i32] zeroinitializer, align 4 #021@c_noattr = thread_local(localexec) global [87 x i32] zeroinitializer, align 422@d = thread_local(localexec) global [87 x i64] zeroinitializer, align 8 #023@d_noattr = thread_local(localexec) global [87 x i64] zeroinitializer, align 8 #024 25@e = thread_local(localexec) global [87 x double] zeroinitializer, align 8 #026@e_noattr = thread_local(localexec) global [87 x double] zeroinitializer, align 827@f = thread_local(localexec) global [87 x float] zeroinitializer, align 4 #028@f_noattr = thread_local(localexec) global [87 x float] zeroinitializer, align 429 30define nonnull ptr @AddrTest1() {31; COMMONCM-LABEL: AddrTest1:32; COMMONCM: # %bb.0: # %entry33; COMMONCM-NEXT: addi r3, r13, a[TL]@le+134; COMMONCM-NEXT: blr35entry:36 %tls0 = tail call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @a)37 %arrayidx = getelementptr inbounds [87 x i8], ptr %tls0, i64 0, i64 138 ret ptr %arrayidx39}40 41define nonnull ptr @AddrTest1_NoAttr() {42; SMALLCM64-LABEL: AddrTest1_NoAttr:43; SMALLCM64: # %bb.0: # %entry44; SMALLCM64-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tprel) @a_noattr45; SMALLCM64-NEXT: add r3, r13, r346; SMALLCM64-NEXT: addi r3, r3, 147; SMALLCM64-NEXT: blr48;49; LARGECM64-LABEL: AddrTest1_NoAttr:50; LARGECM64: # %bb.0: # %entry51; LARGECM64-NEXT: addis r3, L..C0@u(r2)52; LARGECM64-NEXT: ld r3, L..C0@l(r3)53; LARGECM64-NEXT: add r3, r13, r354; LARGECM64-NEXT: addi r3, r3, 155; LARGECM64-NEXT: blr56entry:57 %tls0 = tail call align 1 ptr @llvm.threadlocal.address.p0(ptr align 1 @a_noattr)58 %arrayidx = getelementptr inbounds [87 x i8], ptr %tls0, i64 0, i64 159 ret ptr %arrayidx60}61 62define nonnull ptr @AddrTest2() {63; COMMONCM-LABEL: AddrTest2:64; COMMONCM: # %bb.0: # %entry65; COMMONCM-NEXT: addi r3, r13, b[TL]@le+466; COMMONCM-NEXT: blr67entry:68 %tls0 = tail call align 2 ptr @llvm.threadlocal.address.p0(ptr align 2 @b)69 %arrayidx = getelementptr inbounds [87 x i16], ptr %tls0, i64 0, i64 270 ret ptr %arrayidx71}72 73define nonnull ptr @AddrTest2_NoAttr() {74; SMALLCM64-LABEL: AddrTest2_NoAttr:75; SMALLCM64: # %bb.0: # %entry76; SMALLCM64-NEXT: ld r3, L..C1(r2) # target-flags(ppc-tprel) @b_noattr77; SMALLCM64-NEXT: add r3, r13, r378; SMALLCM64-NEXT: addi r3, r3, 479; SMALLCM64-NEXT: blr80;81; LARGECM64-LABEL: AddrTest2_NoAttr:82; LARGECM64: # %bb.0: # %entry83; LARGECM64-NEXT: addis r3, L..C1@u(r2)84; LARGECM64-NEXT: ld r3, L..C1@l(r3)85; LARGECM64-NEXT: add r3, r13, r386; LARGECM64-NEXT: addi r3, r3, 487; LARGECM64-NEXT: blr88entry:89 %tls0 = tail call align 2 ptr @llvm.threadlocal.address.p0(ptr align 2 @b_noattr)90 %arrayidx = getelementptr inbounds [87 x i16], ptr %tls0, i64 0, i64 291 ret ptr %arrayidx92}93 94define nonnull ptr @AddrTest3() {95; COMMONCM-LABEL: AddrTest3:96; COMMONCM: # %bb.0: # %entry97; COMMONCM-NEXT: addi r3, r13, c[TL]@le+1298; COMMONCM-NEXT: blr99entry:100 %tls0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @c)101 %arrayidx = getelementptr inbounds [87 x i32], ptr %tls0, i64 0, i64 3102 ret ptr %arrayidx103}104 105define nonnull ptr @AddrTest3_NoAttr() {106; SMALLCM64-LABEL: AddrTest3_NoAttr:107; SMALLCM64: # %bb.0: # %entry108; SMALLCM64-NEXT: ld r3, L..C2(r2) # target-flags(ppc-tprel) @c_noattr109; SMALLCM64-NEXT: add r3, r13, r3110; SMALLCM64-NEXT: addi r3, r3, 12111; SMALLCM64-NEXT: blr112;113; LARGECM64-LABEL: AddrTest3_NoAttr:114; LARGECM64: # %bb.0: # %entry115; LARGECM64-NEXT: addis r3, L..C2@u(r2)116; LARGECM64-NEXT: ld r3, L..C2@l(r3)117; LARGECM64-NEXT: add r3, r13, r3118; LARGECM64-NEXT: addi r3, r3, 12119; LARGECM64-NEXT: blr120entry:121 %tls0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @c_noattr)122 %arrayidx = getelementptr inbounds [87 x i32], ptr %tls0, i64 0, i64 3123 ret ptr %arrayidx124}125 126define nonnull ptr @AddrTest4() {127; COMMONCM-LABEL: AddrTest4:128; COMMONCM: # %bb.0: # %entry129; COMMONCM-NEXT: addi r3, r13, c[TL]@le+56130; COMMONCM-NEXT: blr131entry:132 %tls0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @c)133 %arrayidx = getelementptr inbounds [87 x i64], ptr %tls0, i64 0, i64 7134 ret ptr %arrayidx135}136 137define nonnull ptr @AddrTest4_NoAttr() {138; SMALLCM64-LABEL: AddrTest4_NoAttr:139; SMALLCM64: # %bb.0: # %entry140; SMALLCM64-NEXT: ld r3, L..C2(r2) # target-flags(ppc-tprel) @c_noattr141; SMALLCM64-NEXT: add r3, r13, r3142; SMALLCM64-NEXT: addi r3, r3, 56143; SMALLCM64-NEXT: blr144;145; LARGECM64-LABEL: AddrTest4_NoAttr:146; LARGECM64: # %bb.0: # %entry147; LARGECM64-NEXT: addis r3, L..C2@u(r2)148; LARGECM64-NEXT: ld r3, L..C2@l(r3)149; LARGECM64-NEXT: add r3, r13, r3150; LARGECM64-NEXT: addi r3, r3, 56151; LARGECM64-NEXT: blr152entry:153 %tls0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @c_noattr)154 %arrayidx = getelementptr inbounds [87 x i64], ptr %tls0, i64 0, i64 7155 ret ptr %arrayidx156}157 158define nonnull ptr @AddrTest5() {159; COMMONCM-LABEL: AddrTest5:160; COMMONCM: # %bb.0: # %entry161; COMMONCM-NEXT: addi r3, r13, e[TL]@le+48162; COMMONCM-NEXT: blr163entry:164 %tls0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @e)165 %arrayidx = getelementptr inbounds [87 x double], ptr %tls0, i64 0, i64 6166 ret ptr %arrayidx167}168 169define nonnull ptr @AddrTest5_NoAttr() {170; SMALLCM64-LABEL: AddrTest5_NoAttr:171; SMALLCM64: # %bb.0: # %entry172; SMALLCM64-NEXT: ld r3, L..C3(r2) # target-flags(ppc-tprel) @e_noattr173; SMALLCM64-NEXT: add r3, r13, r3174; SMALLCM64-NEXT: addi r3, r3, 48175; SMALLCM64-NEXT: blr176;177; LARGECM64-LABEL: AddrTest5_NoAttr:178; LARGECM64: # %bb.0: # %entry179; LARGECM64-NEXT: addis r3, L..C3@u(r2)180; LARGECM64-NEXT: ld r3, L..C3@l(r3)181; LARGECM64-NEXT: add r3, r13, r3182; LARGECM64-NEXT: addi r3, r3, 48183; LARGECM64-NEXT: blr184entry:185 %tls0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @e_noattr)186 %arrayidx = getelementptr inbounds [87 x double], ptr %tls0, i64 0, i64 6187 ret ptr %arrayidx188}189 190define nonnull ptr @AddrTest6() {191; COMMONCM-LABEL: AddrTest6:192; COMMONCM: # %bb.0: # %entry193; COMMONCM-NEXT: addi r3, r13, f[TL]@le+16194; COMMONCM-NEXT: blr195entry:196 %tls0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @f)197 %arrayidx = getelementptr inbounds [87 x float], ptr %tls0, i64 0, i64 4198 ret ptr %arrayidx199}200 201define nonnull ptr @AddrTest6_NoAttr() {202; SMALLCM64-LABEL: AddrTest6_NoAttr:203; SMALLCM64: # %bb.0: # %entry204; SMALLCM64-NEXT: ld r3, L..C4(r2) # target-flags(ppc-tprel) @f_noattr205; SMALLCM64-NEXT: add r3, r13, r3206; SMALLCM64-NEXT: addi r3, r3, 16207; SMALLCM64-NEXT: blr208;209; LARGECM64-LABEL: AddrTest6_NoAttr:210; LARGECM64: # %bb.0: # %entry211; LARGECM64-NEXT: addis r3, L..C4@u(r2)212; LARGECM64-NEXT: ld r3, L..C4@l(r3)213; LARGECM64-NEXT: add r3, r13, r3214; LARGECM64-NEXT: addi r3, r3, 16215; LARGECM64-NEXT: blr216entry:217 %tls0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @f_noattr)218 %arrayidx = getelementptr inbounds [87 x float], ptr %tls0, i64 0, i64 4219 ret ptr %arrayidx220}221 222attributes #0 = { "aix-small-tls" }223