687 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \3; RUN: -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck %s \4; RUN: --check-prefix=SMALL645; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \6; RUN: -mtriple powerpc64-ibm-aix-xcoff --code-model=large < %s \7; RUN: | FileCheck %s --check-prefix=LARGE648; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \9; RUN: -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s \10; RUN: --check-prefix=SMALL3211; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \12; RUN: -mtriple powerpc-ibm-aix-xcoff --code-model=large < %s \13; RUN: | FileCheck %s --check-prefix=LARGE3214 15@ThreadLocalVarInit = thread_local(localexec) global double 0x4021947AE147AE14, align 816@VarInit = global double 8.787000e+01, align 817@IThreadLocalVarUninit = internal thread_local(localexec) global double 0.000000e+00, align 818@IThreadLocalVarInit = internal thread_local(localexec) global double 5.870000e+00, align 819@ThreadLocalVarUninit = thread_local(localexec) global double 0.000000e+00, align 820declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #121 22define void @storeITLUninit(double noundef %x) {23; SMALL64-LABEL: storeITLUninit:24; SMALL64: # %bb.0: # %entry25; SMALL64-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit26; SMALL64-NEXT: stfdx f1, r13, r327; SMALL64-NEXT: blr28;29; LARGE64-LABEL: storeITLUninit:30; LARGE64: # %bb.0: # %entry31; LARGE64-NEXT: addis r3, L..C0@u(r2)32; LARGE64-NEXT: ld r3, L..C0@l(r3)33; LARGE64-NEXT: stfdx f1, r13, r334; LARGE64-NEXT: blr35;36; SMALL32-LABEL: storeITLUninit:37; SMALL32: # %bb.0: # %entry38; SMALL32-NEXT: mflr r039; SMALL32-NEXT: stwu r1, -32(r1)40; SMALL32-NEXT: lwz r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit41; SMALL32-NEXT: bla .__get_tpointer[PR]42; SMALL32-NEXT: stw r0, 40(r1)43; SMALL32-NEXT: stfdx f1, r3, r444; SMALL32-NEXT: addi r1, r1, 3245; SMALL32-NEXT: lwz r0, 8(r1)46; SMALL32-NEXT: mtlr r047; SMALL32-NEXT: blr48;49; LARGE32-LABEL: storeITLUninit:50; LARGE32: # %bb.0: # %entry51; LARGE32-NEXT: mflr r052; LARGE32-NEXT: stwu r1, -32(r1)53; LARGE32-NEXT: stw r0, 40(r1)54; LARGE32-NEXT: addis r3, L..C0@u(r2)55; LARGE32-NEXT: lwz r4, L..C0@l(r3)56; LARGE32-NEXT: bla .__get_tpointer[PR]57; LARGE32-NEXT: stfdx f1, r3, r458; LARGE32-NEXT: addi r1, r1, 3259; LARGE32-NEXT: lwz r0, 8(r1)60; LARGE32-NEXT: mtlr r061; LARGE32-NEXT: blr62entry:63 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarUninit)64 store double %x, ptr %0, align 865 ret void66}67 68define void @storeITLInit(double noundef %x) {69; SMALL64-LABEL: storeITLInit:70; SMALL64: # %bb.0: # %entry71; SMALL64-NEXT: ld r3, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit72; SMALL64-NEXT: stfdx f1, r13, r373; SMALL64-NEXT: blr74;75; LARGE64-LABEL: storeITLInit:76; LARGE64: # %bb.0: # %entry77; LARGE64-NEXT: addis r3, L..C1@u(r2)78; LARGE64-NEXT: ld r3, L..C1@l(r3)79; LARGE64-NEXT: stfdx f1, r13, r380; LARGE64-NEXT: blr81;82; SMALL32-LABEL: storeITLInit:83; SMALL32: # %bb.0: # %entry84; SMALL32-NEXT: mflr r085; SMALL32-NEXT: stwu r1, -32(r1)86; SMALL32-NEXT: lwz r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit87; SMALL32-NEXT: bla .__get_tpointer[PR]88; SMALL32-NEXT: stw r0, 40(r1)89; SMALL32-NEXT: stfdx f1, r3, r490; SMALL32-NEXT: addi r1, r1, 3291; SMALL32-NEXT: lwz r0, 8(r1)92; SMALL32-NEXT: mtlr r093; SMALL32-NEXT: blr94;95; LARGE32-LABEL: storeITLInit:96; LARGE32: # %bb.0: # %entry97; LARGE32-NEXT: mflr r098; LARGE32-NEXT: stwu r1, -32(r1)99; LARGE32-NEXT: stw r0, 40(r1)100; LARGE32-NEXT: addis r3, L..C1@u(r2)101; LARGE32-NEXT: lwz r4, L..C1@l(r3)102; LARGE32-NEXT: bla .__get_tpointer[PR]103; LARGE32-NEXT: stfdx f1, r3, r4104; LARGE32-NEXT: addi r1, r1, 32105; LARGE32-NEXT: lwz r0, 8(r1)106; LARGE32-NEXT: mtlr r0107; LARGE32-NEXT: blr108entry:109 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)110 store double %x, ptr %0, align 8111 ret void112}113 114define void @storeTLUninit(double noundef %x) {115; SMALL64-LABEL: storeTLUninit:116; SMALL64: # %bb.0: # %entry117; SMALL64-NEXT: ld r3, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit118; SMALL64-NEXT: stfdx f1, r13, r3119; SMALL64-NEXT: blr120;121; LARGE64-LABEL: storeTLUninit:122; LARGE64: # %bb.0: # %entry123; LARGE64-NEXT: addis r3, L..C2@u(r2)124; LARGE64-NEXT: ld r3, L..C2@l(r3)125; LARGE64-NEXT: stfdx f1, r13, r3126; LARGE64-NEXT: blr127;128; SMALL32-LABEL: storeTLUninit:129; SMALL32: # %bb.0: # %entry130; SMALL32-NEXT: mflr r0131; SMALL32-NEXT: stwu r1, -32(r1)132; SMALL32-NEXT: lwz r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit133; SMALL32-NEXT: bla .__get_tpointer[PR]134; SMALL32-NEXT: stw r0, 40(r1)135; SMALL32-NEXT: stfdx f1, r3, r4136; SMALL32-NEXT: addi r1, r1, 32137; SMALL32-NEXT: lwz r0, 8(r1)138; SMALL32-NEXT: mtlr r0139; SMALL32-NEXT: blr140;141; LARGE32-LABEL: storeTLUninit:142; LARGE32: # %bb.0: # %entry143; LARGE32-NEXT: mflr r0144; LARGE32-NEXT: stwu r1, -32(r1)145; LARGE32-NEXT: stw r0, 40(r1)146; LARGE32-NEXT: addis r3, L..C2@u(r2)147; LARGE32-NEXT: lwz r4, L..C2@l(r3)148; LARGE32-NEXT: bla .__get_tpointer[PR]149; LARGE32-NEXT: stfdx f1, r3, r4150; LARGE32-NEXT: addi r1, r1, 32151; LARGE32-NEXT: lwz r0, 8(r1)152; LARGE32-NEXT: mtlr r0153; LARGE32-NEXT: blr154entry:155 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarUninit)156 store double %x, ptr %0, align 8157 ret void158}159 160define void @storeTLInit(double noundef %x) {161; SMALL64-LABEL: storeTLInit:162; SMALL64: # %bb.0: # %entry163; SMALL64-NEXT: ld r3, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit164; SMALL64-NEXT: stfdx f1, r13, r3165; SMALL64-NEXT: blr166;167; LARGE64-LABEL: storeTLInit:168; LARGE64: # %bb.0: # %entry169; LARGE64-NEXT: addis r3, L..C3@u(r2)170; LARGE64-NEXT: ld r3, L..C3@l(r3)171; LARGE64-NEXT: stfdx f1, r13, r3172; LARGE64-NEXT: blr173;174; SMALL32-LABEL: storeTLInit:175; SMALL32: # %bb.0: # %entry176; SMALL32-NEXT: mflr r0177; SMALL32-NEXT: stwu r1, -32(r1)178; SMALL32-NEXT: lwz r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit179; SMALL32-NEXT: bla .__get_tpointer[PR]180; SMALL32-NEXT: stw r0, 40(r1)181; SMALL32-NEXT: stfdx f1, r3, r4182; SMALL32-NEXT: addi r1, r1, 32183; SMALL32-NEXT: lwz r0, 8(r1)184; SMALL32-NEXT: mtlr r0185; SMALL32-NEXT: blr186;187; LARGE32-LABEL: storeTLInit:188; LARGE32: # %bb.0: # %entry189; LARGE32-NEXT: mflr r0190; LARGE32-NEXT: stwu r1, -32(r1)191; LARGE32-NEXT: stw r0, 40(r1)192; LARGE32-NEXT: addis r3, L..C3@u(r2)193; LARGE32-NEXT: lwz r4, L..C3@l(r3)194; LARGE32-NEXT: bla .__get_tpointer[PR]195; LARGE32-NEXT: stfdx f1, r3, r4196; LARGE32-NEXT: addi r1, r1, 32197; LARGE32-NEXT: lwz r0, 8(r1)198; LARGE32-NEXT: mtlr r0199; LARGE32-NEXT: blr200entry:201 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)202 store double %x, ptr %0, align 8203 ret void204}205 206define double @loadITLUninit() {207; SMALL64-LABEL: loadITLUninit:208; SMALL64: # %bb.0: # %entry209; SMALL64-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit210; SMALL64-NEXT: lfdx f1, r13, r3211; SMALL64-NEXT: blr212;213; LARGE64-LABEL: loadITLUninit:214; LARGE64: # %bb.0: # %entry215; LARGE64-NEXT: addis r3, L..C0@u(r2)216; LARGE64-NEXT: ld r3, L..C0@l(r3)217; LARGE64-NEXT: lfdx f1, r13, r3218; LARGE64-NEXT: blr219;220; SMALL32-LABEL: loadITLUninit:221; SMALL32: # %bb.0: # %entry222; SMALL32-NEXT: mflr r0223; SMALL32-NEXT: stwu r1, -32(r1)224; SMALL32-NEXT: lwz r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit225; SMALL32-NEXT: stw r0, 40(r1)226; SMALL32-NEXT: bla .__get_tpointer[PR]227; SMALL32-NEXT: lfdx f1, r3, r4228; SMALL32-NEXT: addi r1, r1, 32229; SMALL32-NEXT: lwz r0, 8(r1)230; SMALL32-NEXT: mtlr r0231; SMALL32-NEXT: blr232;233; LARGE32-LABEL: loadITLUninit:234; LARGE32: # %bb.0: # %entry235; LARGE32-NEXT: mflr r0236; LARGE32-NEXT: stwu r1, -32(r1)237; LARGE32-NEXT: stw r0, 40(r1)238; LARGE32-NEXT: addis r3, L..C0@u(r2)239; LARGE32-NEXT: lwz r4, L..C0@l(r3)240; LARGE32-NEXT: bla .__get_tpointer[PR]241; LARGE32-NEXT: lfdx f1, r3, r4242; LARGE32-NEXT: addi r1, r1, 32243; LARGE32-NEXT: lwz r0, 8(r1)244; LARGE32-NEXT: mtlr r0245; LARGE32-NEXT: blr246entry:247 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarUninit)248 %1 = load double, ptr %0, align 8249 ret double %1250}251 252define double @loadITLUninit2() {253; SMALL64-LABEL: loadITLUninit2:254; SMALL64: # %bb.0: # %entry255; SMALL64-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit256; SMALL64-NEXT: lfdx f0, r13, r3257; SMALL64-NEXT: ld r3, L..C4(r2) # @VarInit258; SMALL64-NEXT: lfd f1, 0(r3)259; SMALL64-NEXT: xsadddp f1, f0, f1260; SMALL64-NEXT: blr261;262; LARGE64-LABEL: loadITLUninit2:263; LARGE64: # %bb.0: # %entry264; LARGE64-NEXT: addis r3, L..C0@u(r2)265; LARGE64-NEXT: ld r3, L..C0@l(r3)266; LARGE64-NEXT: lfdx f0, r13, r3267; LARGE64-NEXT: addis r3, L..C4@u(r2)268; LARGE64-NEXT: ld r3, L..C4@l(r3)269; LARGE64-NEXT: lfd f1, 0(r3)270; LARGE64-NEXT: xsadddp f1, f0, f1271; LARGE64-NEXT: blr272;273; SMALL32-LABEL: loadITLUninit2:274; SMALL32: # %bb.0: # %entry275; SMALL32-NEXT: mflr r0276; SMALL32-NEXT: stwu r1, -32(r1)277; SMALL32-NEXT: lwz r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit278; SMALL32-NEXT: stw r0, 40(r1)279; SMALL32-NEXT: bla .__get_tpointer[PR]280; SMALL32-NEXT: lfdx f0, r3, r4281; SMALL32-NEXT: lwz r3, L..C4(r2) # @VarInit282; SMALL32-NEXT: lfd f1, 0(r3)283; SMALL32-NEXT: xsadddp f1, f0, f1284; SMALL32-NEXT: addi r1, r1, 32285; SMALL32-NEXT: lwz r0, 8(r1)286; SMALL32-NEXT: mtlr r0287; SMALL32-NEXT: blr288;289; LARGE32-LABEL: loadITLUninit2:290; LARGE32: # %bb.0: # %entry291; LARGE32-NEXT: mflr r0292; LARGE32-NEXT: stwu r1, -32(r1)293; LARGE32-NEXT: stw r0, 40(r1)294; LARGE32-NEXT: addis r3, L..C0@u(r2)295; LARGE32-NEXT: lwz r4, L..C0@l(r3)296; LARGE32-NEXT: bla .__get_tpointer[PR]297; LARGE32-NEXT: lfdx f0, r3, r4298; LARGE32-NEXT: addis r3, L..C4@u(r2)299; LARGE32-NEXT: lwz r3, L..C4@l(r3)300; LARGE32-NEXT: lfd f1, 0(r3)301; LARGE32-NEXT: xsadddp f1, f0, f1302; LARGE32-NEXT: addi r1, r1, 32303; LARGE32-NEXT: lwz r0, 8(r1)304; LARGE32-NEXT: mtlr r0305; LARGE32-NEXT: blr306entry:307 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarUninit)308 %1 = load double, ptr %0, align 8309 %2 = load double, ptr @VarInit, align 8310 %add = fadd double %1, %2311 ret double %add312}313 314define double @loadITLInit() {315; SMALL64-LABEL: loadITLInit:316; SMALL64: # %bb.0: # %entry317; SMALL64-NEXT: ld r3, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit318; SMALL64-NEXT: lfdx f1, r13, r3319; SMALL64-NEXT: blr320;321; LARGE64-LABEL: loadITLInit:322; LARGE64: # %bb.0: # %entry323; LARGE64-NEXT: addis r3, L..C1@u(r2)324; LARGE64-NEXT: ld r3, L..C1@l(r3)325; LARGE64-NEXT: lfdx f1, r13, r3326; LARGE64-NEXT: blr327;328; SMALL32-LABEL: loadITLInit:329; SMALL32: # %bb.0: # %entry330; SMALL32-NEXT: mflr r0331; SMALL32-NEXT: stwu r1, -32(r1)332; SMALL32-NEXT: lwz r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit333; SMALL32-NEXT: stw r0, 40(r1)334; SMALL32-NEXT: bla .__get_tpointer[PR]335; SMALL32-NEXT: lfdx f1, r3, r4336; SMALL32-NEXT: addi r1, r1, 32337; SMALL32-NEXT: lwz r0, 8(r1)338; SMALL32-NEXT: mtlr r0339; SMALL32-NEXT: blr340;341; LARGE32-LABEL: loadITLInit:342; LARGE32: # %bb.0: # %entry343; LARGE32-NEXT: mflr r0344; LARGE32-NEXT: stwu r1, -32(r1)345; LARGE32-NEXT: stw r0, 40(r1)346; LARGE32-NEXT: addis r3, L..C1@u(r2)347; LARGE32-NEXT: lwz r4, L..C1@l(r3)348; LARGE32-NEXT: bla .__get_tpointer[PR]349; LARGE32-NEXT: lfdx f1, r3, r4350; LARGE32-NEXT: addi r1, r1, 32351; LARGE32-NEXT: lwz r0, 8(r1)352; LARGE32-NEXT: mtlr r0353; LARGE32-NEXT: blr354entry:355 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)356 %1 = load double, ptr %0, align 8357 ret double %1358}359 360define double @loadITLInit2() {361; SMALL64-LABEL: loadITLInit2:362; SMALL64: # %bb.0: # %entry363; SMALL64-NEXT: ld r3, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit364; SMALL64-NEXT: lfdx f0, r13, r3365; SMALL64-NEXT: ld r3, L..C4(r2) # @VarInit366; SMALL64-NEXT: lfd f1, 0(r3)367; SMALL64-NEXT: xsadddp f1, f0, f1368; SMALL64-NEXT: blr369;370; LARGE64-LABEL: loadITLInit2:371; LARGE64: # %bb.0: # %entry372; LARGE64-NEXT: addis r3, L..C1@u(r2)373; LARGE64-NEXT: ld r3, L..C1@l(r3)374; LARGE64-NEXT: lfdx f0, r13, r3375; LARGE64-NEXT: addis r3, L..C4@u(r2)376; LARGE64-NEXT: ld r3, L..C4@l(r3)377; LARGE64-NEXT: lfd f1, 0(r3)378; LARGE64-NEXT: xsadddp f1, f0, f1379; LARGE64-NEXT: blr380;381; SMALL32-LABEL: loadITLInit2:382; SMALL32: # %bb.0: # %entry383; SMALL32-NEXT: mflr r0384; SMALL32-NEXT: stwu r1, -32(r1)385; SMALL32-NEXT: lwz r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit386; SMALL32-NEXT: stw r0, 40(r1)387; SMALL32-NEXT: bla .__get_tpointer[PR]388; SMALL32-NEXT: lfdx f0, r3, r4389; SMALL32-NEXT: lwz r3, L..C4(r2) # @VarInit390; SMALL32-NEXT: lfd f1, 0(r3)391; SMALL32-NEXT: xsadddp f1, f0, f1392; SMALL32-NEXT: addi r1, r1, 32393; SMALL32-NEXT: lwz r0, 8(r1)394; SMALL32-NEXT: mtlr r0395; SMALL32-NEXT: blr396;397; LARGE32-LABEL: loadITLInit2:398; LARGE32: # %bb.0: # %entry399; LARGE32-NEXT: mflr r0400; LARGE32-NEXT: stwu r1, -32(r1)401; LARGE32-NEXT: stw r0, 40(r1)402; LARGE32-NEXT: addis r3, L..C1@u(r2)403; LARGE32-NEXT: lwz r4, L..C1@l(r3)404; LARGE32-NEXT: bla .__get_tpointer[PR]405; LARGE32-NEXT: lfdx f0, r3, r4406; LARGE32-NEXT: addis r3, L..C4@u(r2)407; LARGE32-NEXT: lwz r3, L..C4@l(r3)408; LARGE32-NEXT: lfd f1, 0(r3)409; LARGE32-NEXT: xsadddp f1, f0, f1410; LARGE32-NEXT: addi r1, r1, 32411; LARGE32-NEXT: lwz r0, 8(r1)412; LARGE32-NEXT: mtlr r0413; LARGE32-NEXT: blr414entry:415 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)416 %1 = load double, ptr %0, align 8417 %2 = load double, ptr @VarInit, align 8418 %add = fadd double %1, %2419 ret double %add420}421 422define double @loadTLUninit() {423; SMALL64-LABEL: loadTLUninit:424; SMALL64: # %bb.0: # %entry425; SMALL64-NEXT: ld r3, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit426; SMALL64-NEXT: lfdx f1, r13, r3427; SMALL64-NEXT: blr428;429; LARGE64-LABEL: loadTLUninit:430; LARGE64: # %bb.0: # %entry431; LARGE64-NEXT: addis r3, L..C2@u(r2)432; LARGE64-NEXT: ld r3, L..C2@l(r3)433; LARGE64-NEXT: lfdx f1, r13, r3434; LARGE64-NEXT: blr435;436; SMALL32-LABEL: loadTLUninit:437; SMALL32: # %bb.0: # %entry438; SMALL32-NEXT: mflr r0439; SMALL32-NEXT: stwu r1, -32(r1)440; SMALL32-NEXT: lwz r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit441; SMALL32-NEXT: stw r0, 40(r1)442; SMALL32-NEXT: bla .__get_tpointer[PR]443; SMALL32-NEXT: lfdx f1, r3, r4444; SMALL32-NEXT: addi r1, r1, 32445; SMALL32-NEXT: lwz r0, 8(r1)446; SMALL32-NEXT: mtlr r0447; SMALL32-NEXT: blr448;449; LARGE32-LABEL: loadTLUninit:450; LARGE32: # %bb.0: # %entry451; LARGE32-NEXT: mflr r0452; LARGE32-NEXT: stwu r1, -32(r1)453; LARGE32-NEXT: stw r0, 40(r1)454; LARGE32-NEXT: addis r3, L..C2@u(r2)455; LARGE32-NEXT: lwz r4, L..C2@l(r3)456; LARGE32-NEXT: bla .__get_tpointer[PR]457; LARGE32-NEXT: lfdx f1, r3, r4458; LARGE32-NEXT: addi r1, r1, 32459; LARGE32-NEXT: lwz r0, 8(r1)460; LARGE32-NEXT: mtlr r0461; LARGE32-NEXT: blr462entry:463 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarUninit)464 %1 = load double, ptr %0, align 8465 ret double %1466}467 468define double @loadTLUninit2() {469; SMALL64-LABEL: loadTLUninit2:470; SMALL64: # %bb.0: # %entry471; SMALL64-NEXT: ld r3, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit472; SMALL64-NEXT: lfdx f0, r13, r3473; SMALL64-NEXT: ld r3, L..C4(r2) # @VarInit474; SMALL64-NEXT: lfd f1, 0(r3)475; SMALL64-NEXT: xsadddp f1, f0, f1476; SMALL64-NEXT: blr477;478; LARGE64-LABEL: loadTLUninit2:479; LARGE64: # %bb.0: # %entry480; LARGE64-NEXT: addis r3, L..C2@u(r2)481; LARGE64-NEXT: ld r3, L..C2@l(r3)482; LARGE64-NEXT: lfdx f0, r13, r3483; LARGE64-NEXT: addis r3, L..C4@u(r2)484; LARGE64-NEXT: ld r3, L..C4@l(r3)485; LARGE64-NEXT: lfd f1, 0(r3)486; LARGE64-NEXT: xsadddp f1, f0, f1487; LARGE64-NEXT: blr488;489; SMALL32-LABEL: loadTLUninit2:490; SMALL32: # %bb.0: # %entry491; SMALL32-NEXT: mflr r0492; SMALL32-NEXT: stwu r1, -32(r1)493; SMALL32-NEXT: lwz r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit494; SMALL32-NEXT: stw r0, 40(r1)495; SMALL32-NEXT: bla .__get_tpointer[PR]496; SMALL32-NEXT: lfdx f0, r3, r4497; SMALL32-NEXT: lwz r3, L..C4(r2) # @VarInit498; SMALL32-NEXT: lfd f1, 0(r3)499; SMALL32-NEXT: xsadddp f1, f0, f1500; SMALL32-NEXT: addi r1, r1, 32501; SMALL32-NEXT: lwz r0, 8(r1)502; SMALL32-NEXT: mtlr r0503; SMALL32-NEXT: blr504;505; LARGE32-LABEL: loadTLUninit2:506; LARGE32: # %bb.0: # %entry507; LARGE32-NEXT: mflr r0508; LARGE32-NEXT: stwu r1, -32(r1)509; LARGE32-NEXT: stw r0, 40(r1)510; LARGE32-NEXT: addis r3, L..C2@u(r2)511; LARGE32-NEXT: lwz r4, L..C2@l(r3)512; LARGE32-NEXT: bla .__get_tpointer[PR]513; LARGE32-NEXT: lfdx f0, r3, r4514; LARGE32-NEXT: addis r3, L..C4@u(r2)515; LARGE32-NEXT: lwz r3, L..C4@l(r3)516; LARGE32-NEXT: lfd f1, 0(r3)517; LARGE32-NEXT: xsadddp f1, f0, f1518; LARGE32-NEXT: addi r1, r1, 32519; LARGE32-NEXT: lwz r0, 8(r1)520; LARGE32-NEXT: mtlr r0521; LARGE32-NEXT: blr522entry:523 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarUninit)524 %1 = load double, ptr %0, align 8525 %2 = load double, ptr @VarInit, align 8526 %add = fadd double %1, %2527 ret double %add528}529 530define double @loadTLInit() {531; SMALL64-LABEL: loadTLInit:532; SMALL64: # %bb.0: # %entry533; SMALL64-NEXT: ld r3, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit534; SMALL64-NEXT: lfdx f1, r13, r3535; SMALL64-NEXT: blr536;537; LARGE64-LABEL: loadTLInit:538; LARGE64: # %bb.0: # %entry539; LARGE64-NEXT: addis r3, L..C3@u(r2)540; LARGE64-NEXT: ld r3, L..C3@l(r3)541; LARGE64-NEXT: lfdx f1, r13, r3542; LARGE64-NEXT: blr543;544; SMALL32-LABEL: loadTLInit:545; SMALL32: # %bb.0: # %entry546; SMALL32-NEXT: mflr r0547; SMALL32-NEXT: stwu r1, -32(r1)548; SMALL32-NEXT: lwz r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit549; SMALL32-NEXT: stw r0, 40(r1)550; SMALL32-NEXT: bla .__get_tpointer[PR]551; SMALL32-NEXT: lfdx f1, r3, r4552; SMALL32-NEXT: addi r1, r1, 32553; SMALL32-NEXT: lwz r0, 8(r1)554; SMALL32-NEXT: mtlr r0555; SMALL32-NEXT: blr556;557; LARGE32-LABEL: loadTLInit:558; LARGE32: # %bb.0: # %entry559; LARGE32-NEXT: mflr r0560; LARGE32-NEXT: stwu r1, -32(r1)561; LARGE32-NEXT: stw r0, 40(r1)562; LARGE32-NEXT: addis r3, L..C3@u(r2)563; LARGE32-NEXT: lwz r4, L..C3@l(r3)564; LARGE32-NEXT: bla .__get_tpointer[PR]565; LARGE32-NEXT: lfdx f1, r3, r4566; LARGE32-NEXT: addi r1, r1, 32567; LARGE32-NEXT: lwz r0, 8(r1)568; LARGE32-NEXT: mtlr r0569; LARGE32-NEXT: blr570entry:571 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)572 %1 = load double, ptr %0, align 8573 ret double %1574}575 576define double @loadTLInit2() {577; SMALL64-LABEL: loadTLInit2:578; SMALL64: # %bb.0: # %entry579; SMALL64-NEXT: ld r3, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit580; SMALL64-NEXT: lfdx f0, r13, r3581; SMALL64-NEXT: ld r3, L..C4(r2) # @VarInit582; SMALL64-NEXT: lfd f1, 0(r3)583; SMALL64-NEXT: xsadddp f1, f0, f1584; SMALL64-NEXT: blr585;586; LARGE64-LABEL: loadTLInit2:587; LARGE64: # %bb.0: # %entry588; LARGE64-NEXT: addis r3, L..C3@u(r2)589; LARGE64-NEXT: ld r3, L..C3@l(r3)590; LARGE64-NEXT: lfdx f0, r13, r3591; LARGE64-NEXT: addis r3, L..C4@u(r2)592; LARGE64-NEXT: ld r3, L..C4@l(r3)593; LARGE64-NEXT: lfd f1, 0(r3)594; LARGE64-NEXT: xsadddp f1, f0, f1595; LARGE64-NEXT: blr596;597; SMALL32-LABEL: loadTLInit2:598; SMALL32: # %bb.0: # %entry599; SMALL32-NEXT: mflr r0600; SMALL32-NEXT: stwu r1, -32(r1)601; SMALL32-NEXT: lwz r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit602; SMALL32-NEXT: stw r0, 40(r1)603; SMALL32-NEXT: bla .__get_tpointer[PR]604; SMALL32-NEXT: lfdx f0, r3, r4605; SMALL32-NEXT: lwz r3, L..C4(r2) # @VarInit606; SMALL32-NEXT: lfd f1, 0(r3)607; SMALL32-NEXT: xsadddp f1, f0, f1608; SMALL32-NEXT: addi r1, r1, 32609; SMALL32-NEXT: lwz r0, 8(r1)610; SMALL32-NEXT: mtlr r0611; SMALL32-NEXT: blr612;613; LARGE32-LABEL: loadTLInit2:614; LARGE32: # %bb.0: # %entry615; LARGE32-NEXT: mflr r0616; LARGE32-NEXT: stwu r1, -32(r1)617; LARGE32-NEXT: stw r0, 40(r1)618; LARGE32-NEXT: addis r3, L..C3@u(r2)619; LARGE32-NEXT: lwz r4, L..C3@l(r3)620; LARGE32-NEXT: bla .__get_tpointer[PR]621; LARGE32-NEXT: lfdx f0, r3, r4622; LARGE32-NEXT: addis r3, L..C4@u(r2)623; LARGE32-NEXT: lwz r3, L..C4@l(r3)624; LARGE32-NEXT: lfd f1, 0(r3)625; LARGE32-NEXT: xsadddp f1, f0, f1626; LARGE32-NEXT: addi r1, r1, 32627; LARGE32-NEXT: lwz r0, 8(r1)628; LARGE32-NEXT: mtlr r0629; LARGE32-NEXT: blr630entry:631 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)632 %1 = load double, ptr %0, align 8633 %2 = load double, ptr @VarInit, align 8634 %add = fadd double %1, %2635 ret double %add636}637 638; TOC Entry Checks.639 640; SMALL64-LABEL: .toc641; SMALL64-LABEL: L..C0:642; SMALL64-NEXT: .tc IThreadLocalVarUninit[TC],IThreadLocalVarUninit[UL]@le643; SMALL64-LABEL: L..C1:644; SMALL64-NEXT: .tc IThreadLocalVarInit[TC],IThreadLocalVarInit[TL]@le645; SMALL64-LABEL: L..C2:646; SMALL64-NEXT: .tc ThreadLocalVarUninit[TC],ThreadLocalVarUninit[TL]@le647; SMALL64-LABEL: L..C3:648; SMALL64-NEXT: .tc ThreadLocalVarInit[TC],ThreadLocalVarInit[TL]@le649; SMALL64-LABEL: L..C4:650; SMALL64-NEXT: .tc VarInit[TC],VarInit[RW]651 652; LARGE64-LABEL: .toc653; LARGE64-LABEL: L..C0:654; LARGE64-NEXT: .tc IThreadLocalVarUninit[TE],IThreadLocalVarUninit[UL]@le655; LARGE64-LABEL: L..C1:656; LARGE64-NEXT: .tc IThreadLocalVarInit[TE],IThreadLocalVarInit[TL]@le657; LARGE64-LABEL: L..C2:658; LARGE64-NEXT: .tc ThreadLocalVarUninit[TE],ThreadLocalVarUninit[TL]@le659; LARGE64-LABEL: L..C3:660; LARGE64-NEXT: .tc ThreadLocalVarInit[TE],ThreadLocalVarInit[TL]@le661; LARGE64-LABEL: L..C4:662; LARGE64-NEXT: .tc VarInit[TE],VarInit[RW]663 664; SMALL32-LABEL: .toc665; SMALL32-LABEL: L..C0:666; SMALL32-NEXT: .tc IThreadLocalVarUninit[TC],IThreadLocalVarUninit[UL]@le667; SMALL32-LABEL: L..C1:668; SMALL32-NEXT: .tc IThreadLocalVarInit[TC],IThreadLocalVarInit[TL]@le669; SMALL32-LABEL: L..C2:670; SMALL32-NEXT: .tc ThreadLocalVarUninit[TC],ThreadLocalVarUninit[TL]@le671; SMALL32-LABEL: L..C3:672; SMALL32-NEXT: .tc ThreadLocalVarInit[TC],ThreadLocalVarInit[TL]@le673; SMALL32-LABEL: L..C4:674; SMALL32-NEXT: .tc VarInit[TC],VarInit[RW]675 676; LARGE32-LABEL: .toc677; LARGE32-LABEL: L..C0:678; LARGE32-NEXT: .tc IThreadLocalVarUninit[TE],IThreadLocalVarUninit[UL]@le679; LARGE32-LABEL: L..C1:680; LARGE32-NEXT: .tc IThreadLocalVarInit[TE],IThreadLocalVarInit[TL]@le681; LARGE32-LABEL: L..C2:682; LARGE32-NEXT: .tc ThreadLocalVarUninit[TE],ThreadLocalVarUninit[TL]@le683; LARGE32-LABEL: L..C3:684; LARGE32-NEXT: .tc ThreadLocalVarInit[TE],ThreadLocalVarInit[TL]@le685; LARGE32-LABEL: L..C4:686; LARGE32-NEXT: .tc VarInit[TE],VarInit[RW]687