brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.0 KiB · 533c866 Raw
759 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 i64 1, align 816@VarInit = global i64 87, align 817@IThreadLocalVarUninit = internal thread_local(localexec) global i64 0, align 818@IThreadLocalVarInit = internal thread_local(localexec) global i64 1, align 819@ThreadLocalVarUninit = thread_local(localexec) global i64 0, align 820declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #121 22define void @storeITLUninit(i64 noundef %x) {23; SMALL64-LABEL: storeITLUninit:24; SMALL64:       # %bb.0: # %entry25; SMALL64-NEXT:    ld r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit26; SMALL64-NEXT:    stdx r3, r13, r427; SMALL64-NEXT:    blr28;29; LARGE64-LABEL: storeITLUninit:30; LARGE64:       # %bb.0: # %entry31; LARGE64-NEXT:    addis r4, L..C0@u(r2)32; LARGE64-NEXT:    ld r4, L..C0@l(r4)33; LARGE64-NEXT:    stdx r3, r13, r434; 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 r6, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit41; SMALL32-NEXT:    mr r5, r342; SMALL32-NEXT:    bla .__get_tpointer[PR]43; SMALL32-NEXT:    stw r0, 40(r1)44; SMALL32-NEXT:    add r3, r3, r645; SMALL32-NEXT:    stw r4, 4(r3)46; SMALL32-NEXT:    stw r5, 0(r3)47; SMALL32-NEXT:    addi r1, r1, 3248; SMALL32-NEXT:    lwz r0, 8(r1)49; SMALL32-NEXT:    mtlr r050; SMALL32-NEXT:    blr51;52; LARGE32-LABEL: storeITLUninit:53; LARGE32:       # %bb.0: # %entry54; LARGE32-NEXT:    mflr r055; LARGE32-NEXT:    stwu r1, -32(r1)56; LARGE32-NEXT:    stw r0, 40(r1)57; LARGE32-NEXT:    mr r5, r358; LARGE32-NEXT:    addis r3, L..C0@u(r2)59; LARGE32-NEXT:    lwz r6, L..C0@l(r3)60; LARGE32-NEXT:    bla .__get_tpointer[PR]61; LARGE32-NEXT:    add r3, r3, r662; LARGE32-NEXT:    stw r4, 4(r3)63; LARGE32-NEXT:    stw r5, 0(r3)64; LARGE32-NEXT:    addi r1, r1, 3265; LARGE32-NEXT:    lwz r0, 8(r1)66; LARGE32-NEXT:    mtlr r067; LARGE32-NEXT:    blr68entry:69  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarUninit)70  store i64 %x, ptr %0, align 871  ret void72}73 74define void @storeITLInit(i64 noundef %x) {75; SMALL64-LABEL: storeITLInit:76; SMALL64:       # %bb.0: # %entry77; SMALL64-NEXT:    ld r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit78; SMALL64-NEXT:    stdx r3, r13, r479; SMALL64-NEXT:    blr80;81; LARGE64-LABEL: storeITLInit:82; LARGE64:       # %bb.0: # %entry83; LARGE64-NEXT:    addis r4, L..C1@u(r2)84; LARGE64-NEXT:    ld r4, L..C1@l(r4)85; LARGE64-NEXT:    stdx r3, r13, r486; LARGE64-NEXT:    blr87;88; SMALL32-LABEL: storeITLInit:89; SMALL32:       # %bb.0: # %entry90; SMALL32-NEXT:    mflr r091; SMALL32-NEXT:    stwu r1, -32(r1)92; SMALL32-NEXT:    lwz r6, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit93; SMALL32-NEXT:    mr r5, r394; SMALL32-NEXT:    bla .__get_tpointer[PR]95; SMALL32-NEXT:    stw r0, 40(r1)96; SMALL32-NEXT:    add r3, r3, r697; SMALL32-NEXT:    stw r4, 4(r3)98; SMALL32-NEXT:    stw r5, 0(r3)99; SMALL32-NEXT:    addi r1, r1, 32100; SMALL32-NEXT:    lwz r0, 8(r1)101; SMALL32-NEXT:    mtlr r0102; SMALL32-NEXT:    blr103;104; LARGE32-LABEL: storeITLInit:105; LARGE32:       # %bb.0: # %entry106; LARGE32-NEXT:    mflr r0107; LARGE32-NEXT:    stwu r1, -32(r1)108; LARGE32-NEXT:    stw r0, 40(r1)109; LARGE32-NEXT:    mr r5, r3110; LARGE32-NEXT:    addis r3, L..C1@u(r2)111; LARGE32-NEXT:    lwz r6, L..C1@l(r3)112; LARGE32-NEXT:    bla .__get_tpointer[PR]113; LARGE32-NEXT:    add r3, r3, r6114; LARGE32-NEXT:    stw r4, 4(r3)115; LARGE32-NEXT:    stw r5, 0(r3)116; LARGE32-NEXT:    addi r1, r1, 32117; LARGE32-NEXT:    lwz r0, 8(r1)118; LARGE32-NEXT:    mtlr r0119; LARGE32-NEXT:    blr120entry:121  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)122  store i64 %x, ptr %0, align 8123  ret void124}125 126define void @storeTLUninit(i64 noundef %x) {127; SMALL64-LABEL: storeTLUninit:128; SMALL64:       # %bb.0: # %entry129; SMALL64-NEXT:    ld r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit130; SMALL64-NEXT:    stdx r3, r13, r4131; SMALL64-NEXT:    blr132;133; LARGE64-LABEL: storeTLUninit:134; LARGE64:       # %bb.0: # %entry135; LARGE64-NEXT:    addis r4, L..C2@u(r2)136; LARGE64-NEXT:    ld r4, L..C2@l(r4)137; LARGE64-NEXT:    stdx r3, r13, r4138; LARGE64-NEXT:    blr139;140; SMALL32-LABEL: storeTLUninit:141; SMALL32:       # %bb.0: # %entry142; SMALL32-NEXT:    mflr r0143; SMALL32-NEXT:    stwu r1, -32(r1)144; SMALL32-NEXT:    lwz r6, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit145; SMALL32-NEXT:    mr r5, r3146; SMALL32-NEXT:    bla .__get_tpointer[PR]147; SMALL32-NEXT:    stw r0, 40(r1)148; SMALL32-NEXT:    add r3, r3, r6149; SMALL32-NEXT:    stw r4, 4(r3)150; SMALL32-NEXT:    stw r5, 0(r3)151; SMALL32-NEXT:    addi r1, r1, 32152; SMALL32-NEXT:    lwz r0, 8(r1)153; SMALL32-NEXT:    mtlr r0154; SMALL32-NEXT:    blr155;156; LARGE32-LABEL: storeTLUninit:157; LARGE32:       # %bb.0: # %entry158; LARGE32-NEXT:    mflr r0159; LARGE32-NEXT:    stwu r1, -32(r1)160; LARGE32-NEXT:    stw r0, 40(r1)161; LARGE32-NEXT:    mr r5, r3162; LARGE32-NEXT:    addis r3, L..C2@u(r2)163; LARGE32-NEXT:    lwz r6, L..C2@l(r3)164; LARGE32-NEXT:    bla .__get_tpointer[PR]165; LARGE32-NEXT:    add r3, r3, r6166; LARGE32-NEXT:    stw r4, 4(r3)167; LARGE32-NEXT:    stw r5, 0(r3)168; LARGE32-NEXT:    addi r1, r1, 32169; LARGE32-NEXT:    lwz r0, 8(r1)170; LARGE32-NEXT:    mtlr r0171; LARGE32-NEXT:    blr172entry:173  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarUninit)174  store i64 %x, ptr %0, align 8175  ret void176}177 178define void @storeTLInit(i64 noundef %x) {179; SMALL64-LABEL: storeTLInit:180; SMALL64:       # %bb.0: # %entry181; SMALL64-NEXT:    ld r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit182; SMALL64-NEXT:    stdx r3, r13, r4183; SMALL64-NEXT:    blr184;185; LARGE64-LABEL: storeTLInit:186; LARGE64:       # %bb.0: # %entry187; LARGE64-NEXT:    addis r4, L..C3@u(r2)188; LARGE64-NEXT:    ld r4, L..C3@l(r4)189; LARGE64-NEXT:    stdx r3, r13, r4190; LARGE64-NEXT:    blr191;192; SMALL32-LABEL: storeTLInit:193; SMALL32:       # %bb.0: # %entry194; SMALL32-NEXT:    mflr r0195; SMALL32-NEXT:    stwu r1, -32(r1)196; SMALL32-NEXT:    lwz r6, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit197; SMALL32-NEXT:    mr r5, r3198; SMALL32-NEXT:    bla .__get_tpointer[PR]199; SMALL32-NEXT:    stw r0, 40(r1)200; SMALL32-NEXT:    add r3, r3, r6201; SMALL32-NEXT:    stw r4, 4(r3)202; SMALL32-NEXT:    stw r5, 0(r3)203; SMALL32-NEXT:    addi r1, r1, 32204; SMALL32-NEXT:    lwz r0, 8(r1)205; SMALL32-NEXT:    mtlr r0206; SMALL32-NEXT:    blr207;208; LARGE32-LABEL: storeTLInit:209; LARGE32:       # %bb.0: # %entry210; LARGE32-NEXT:    mflr r0211; LARGE32-NEXT:    stwu r1, -32(r1)212; LARGE32-NEXT:    stw r0, 40(r1)213; LARGE32-NEXT:    mr r5, r3214; LARGE32-NEXT:    addis r3, L..C3@u(r2)215; LARGE32-NEXT:    lwz r6, L..C3@l(r3)216; LARGE32-NEXT:    bla .__get_tpointer[PR]217; LARGE32-NEXT:    add r3, r3, r6218; LARGE32-NEXT:    stw r4, 4(r3)219; LARGE32-NEXT:    stw r5, 0(r3)220; LARGE32-NEXT:    addi r1, r1, 32221; LARGE32-NEXT:    lwz r0, 8(r1)222; LARGE32-NEXT:    mtlr r0223; LARGE32-NEXT:    blr224entry:225  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)226  store i64 %x, ptr %0, align 8227  ret void228}229 230define i64 @loadITLUninit() {231; SMALL64-LABEL: loadITLUninit:232; SMALL64:       # %bb.0: # %entry233; SMALL64-NEXT:    ld r3, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit234; SMALL64-NEXT:    ldx r3, r13, r3235; SMALL64-NEXT:    blr236;237; LARGE64-LABEL: loadITLUninit:238; LARGE64:       # %bb.0: # %entry239; LARGE64-NEXT:    addis r3, L..C0@u(r2)240; LARGE64-NEXT:    ld r3, L..C0@l(r3)241; LARGE64-NEXT:    ldx r3, r13, r3242; LARGE64-NEXT:    blr243;244; SMALL32-LABEL: loadITLUninit:245; SMALL32:       # %bb.0: # %entry246; SMALL32-NEXT:    mflr r0247; SMALL32-NEXT:    stwu r1, -32(r1)248; SMALL32-NEXT:    lwz r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit249; SMALL32-NEXT:    bla .__get_tpointer[PR]250; SMALL32-NEXT:    stw r0, 40(r1)251; SMALL32-NEXT:    add r4, r3, r4252; SMALL32-NEXT:    lwz r3, 0(r4)253; SMALL32-NEXT:    lwz r4, 4(r4)254; SMALL32-NEXT:    addi r1, r1, 32255; SMALL32-NEXT:    lwz r0, 8(r1)256; SMALL32-NEXT:    mtlr r0257; SMALL32-NEXT:    blr258;259; LARGE32-LABEL: loadITLUninit:260; LARGE32:       # %bb.0: # %entry261; LARGE32-NEXT:    mflr r0262; LARGE32-NEXT:    stwu r1, -32(r1)263; LARGE32-NEXT:    stw r0, 40(r1)264; LARGE32-NEXT:    addis r3, L..C0@u(r2)265; LARGE32-NEXT:    lwz r4, L..C0@l(r3)266; LARGE32-NEXT:    bla .__get_tpointer[PR]267; LARGE32-NEXT:    add r4, r3, r4268; LARGE32-NEXT:    lwz r3, 0(r4)269; LARGE32-NEXT:    lwz r4, 4(r4)270; LARGE32-NEXT:    addi r1, r1, 32271; LARGE32-NEXT:    lwz r0, 8(r1)272; LARGE32-NEXT:    mtlr r0273; LARGE32-NEXT:    blr274entry:275  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarUninit)276  %1 = load i64, ptr %0, align 8277  ret i64 %1278}279 280define i64 @loadITLUninit2() {281; SMALL64-LABEL: loadITLUninit2:282; SMALL64:       # %bb.0: # %entry283; SMALL64-NEXT:    ld r3, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit284; SMALL64-NEXT:    ld r4, L..C4(r2) # @VarInit285; SMALL64-NEXT:    ldx r3, r13, r3286; SMALL64-NEXT:    ld r4, 0(r4)287; SMALL64-NEXT:    add r3, r4, r3288; SMALL64-NEXT:    blr289;290; LARGE64-LABEL: loadITLUninit2:291; LARGE64:       # %bb.0: # %entry292; LARGE64-NEXT:    addis r3, L..C0@u(r2)293; LARGE64-NEXT:    addis r4, L..C4@u(r2)294; LARGE64-NEXT:    ld r3, L..C0@l(r3)295; LARGE64-NEXT:    ld r4, L..C4@l(r4)296; LARGE64-NEXT:    ldx r3, r13, r3297; LARGE64-NEXT:    ld r4, 0(r4)298; LARGE64-NEXT:    add r3, r4, r3299; LARGE64-NEXT:    blr300;301; SMALL32-LABEL: loadITLUninit2:302; SMALL32:       # %bb.0: # %entry303; SMALL32-NEXT:    mflr r0304; SMALL32-NEXT:    stwu r1, -32(r1)305; SMALL32-NEXT:    lwz r4, L..C0(r2) # target-flags(ppc-tprel) @IThreadLocalVarUninit306; SMALL32-NEXT:    bla .__get_tpointer[PR]307; SMALL32-NEXT:    stw r0, 40(r1)308; SMALL32-NEXT:    add r3, r3, r4309; SMALL32-NEXT:    lwz r4, L..C4(r2) # @VarInit310; SMALL32-NEXT:    lwz r5, 0(r3)311; SMALL32-NEXT:    lwz r3, 4(r3)312; SMALL32-NEXT:    lwz r6, 0(r4)313; SMALL32-NEXT:    lwz r4, 4(r4)314; SMALL32-NEXT:    addc r4, r4, r3315; SMALL32-NEXT:    adde r3, r6, r5316; SMALL32-NEXT:    addi r1, r1, 32317; SMALL32-NEXT:    lwz r0, 8(r1)318; SMALL32-NEXT:    mtlr r0319; SMALL32-NEXT:    blr320;321; LARGE32-LABEL: loadITLUninit2:322; LARGE32:       # %bb.0: # %entry323; LARGE32-NEXT:    mflr r0324; LARGE32-NEXT:    stwu r1, -32(r1)325; LARGE32-NEXT:    stw r0, 40(r1)326; LARGE32-NEXT:    addis r3, L..C0@u(r2)327; LARGE32-NEXT:    lwz r4, L..C0@l(r3)328; LARGE32-NEXT:    bla .__get_tpointer[PR]329; LARGE32-NEXT:    add r3, r3, r4330; LARGE32-NEXT:    lwz r5, 0(r3)331; LARGE32-NEXT:    lwz r3, 4(r3)332; LARGE32-NEXT:    addis r4, L..C4@u(r2)333; LARGE32-NEXT:    lwz r4, L..C4@l(r4)334; LARGE32-NEXT:    lwz r6, 0(r4)335; LARGE32-NEXT:    lwz r4, 4(r4)336; LARGE32-NEXT:    addc r4, r4, r3337; LARGE32-NEXT:    adde r3, r6, r5338; LARGE32-NEXT:    addi r1, r1, 32339; LARGE32-NEXT:    lwz r0, 8(r1)340; LARGE32-NEXT:    mtlr r0341; LARGE32-NEXT:    blr342entry:343  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarUninit)344  %1 = load i64, ptr %0, align 8345  %2 = load i64, ptr @VarInit, align 8346  %add = add nsw i64 %2, %1347  ret i64 %add348}349 350define i64 @loadITLInit() {351; SMALL64-LABEL: loadITLInit:352; SMALL64:       # %bb.0: # %entry353; SMALL64-NEXT:    ld r3, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit354; SMALL64-NEXT:    ldx r3, r13, r3355; SMALL64-NEXT:    blr356;357; LARGE64-LABEL: loadITLInit:358; LARGE64:       # %bb.0: # %entry359; LARGE64-NEXT:    addis r3, L..C1@u(r2)360; LARGE64-NEXT:    ld r3, L..C1@l(r3)361; LARGE64-NEXT:    ldx r3, r13, r3362; LARGE64-NEXT:    blr363;364; SMALL32-LABEL: loadITLInit:365; SMALL32:       # %bb.0: # %entry366; SMALL32-NEXT:    mflr r0367; SMALL32-NEXT:    stwu r1, -32(r1)368; SMALL32-NEXT:    lwz r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit369; SMALL32-NEXT:    bla .__get_tpointer[PR]370; SMALL32-NEXT:    stw r0, 40(r1)371; SMALL32-NEXT:    add r4, r3, r4372; SMALL32-NEXT:    lwz r3, 0(r4)373; SMALL32-NEXT:    lwz r4, 4(r4)374; SMALL32-NEXT:    addi r1, r1, 32375; SMALL32-NEXT:    lwz r0, 8(r1)376; SMALL32-NEXT:    mtlr r0377; SMALL32-NEXT:    blr378;379; LARGE32-LABEL: loadITLInit:380; LARGE32:       # %bb.0: # %entry381; LARGE32-NEXT:    mflr r0382; LARGE32-NEXT:    stwu r1, -32(r1)383; LARGE32-NEXT:    stw r0, 40(r1)384; LARGE32-NEXT:    addis r3, L..C1@u(r2)385; LARGE32-NEXT:    lwz r4, L..C1@l(r3)386; LARGE32-NEXT:    bla .__get_tpointer[PR]387; LARGE32-NEXT:    add r4, r3, r4388; LARGE32-NEXT:    lwz r3, 0(r4)389; LARGE32-NEXT:    lwz r4, 4(r4)390; LARGE32-NEXT:    addi r1, r1, 32391; LARGE32-NEXT:    lwz r0, 8(r1)392; LARGE32-NEXT:    mtlr r0393; LARGE32-NEXT:    blr394entry:395  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @IThreadLocalVarInit)396  %1 = load i64, ptr %0, align 8397  ret i64 %1398}399 400define i64 @loadITLInit2() {401; SMALL64-LABEL: loadITLInit2:402; SMALL64:       # %bb.0: # %entry403; SMALL64-NEXT:    ld r3, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit404; SMALL64-NEXT:    ld r4, L..C4(r2) # @VarInit405; SMALL64-NEXT:    ldx r3, r13, r3406; SMALL64-NEXT:    ld r4, 0(r4)407; SMALL64-NEXT:    add r3, r4, r3408; SMALL64-NEXT:    blr409;410; LARGE64-LABEL: loadITLInit2:411; LARGE64:       # %bb.0: # %entry412; LARGE64-NEXT:    addis r3, L..C1@u(r2)413; LARGE64-NEXT:    addis r4, L..C4@u(r2)414; LARGE64-NEXT:    ld r3, L..C1@l(r3)415; LARGE64-NEXT:    ld r4, L..C4@l(r4)416; LARGE64-NEXT:    ldx r3, r13, r3417; LARGE64-NEXT:    ld r4, 0(r4)418; LARGE64-NEXT:    add r3, r4, r3419; LARGE64-NEXT:    blr420;421; SMALL32-LABEL: loadITLInit2:422; SMALL32:       # %bb.0: # %entry423; SMALL32-NEXT:    mflr r0424; SMALL32-NEXT:    stwu r1, -32(r1)425; SMALL32-NEXT:    lwz r4, L..C1(r2) # target-flags(ppc-tprel) @IThreadLocalVarInit426; SMALL32-NEXT:    bla .__get_tpointer[PR]427; SMALL32-NEXT:    stw r0, 40(r1)428; SMALL32-NEXT:    add r3, r3, r4429; SMALL32-NEXT:    lwz r4, L..C4(r2) # @VarInit430; SMALL32-NEXT:    lwz r5, 0(r3)431; SMALL32-NEXT:    lwz r3, 4(r3)432; SMALL32-NEXT:    lwz r6, 0(r4)433; SMALL32-NEXT:    lwz r4, 4(r4)434; SMALL32-NEXT:    addc r4, r4, r3435; SMALL32-NEXT:    adde r3, r6, r5436; SMALL32-NEXT:    addi r1, r1, 32437; SMALL32-NEXT:    lwz r0, 8(r1)438; SMALL32-NEXT:    mtlr r0439; SMALL32-NEXT:    blr440;441; LARGE32-LABEL: loadITLInit2:442; LARGE32:       # %bb.0: # %entry443; LARGE32-NEXT:    mflr r0444; LARGE32-NEXT:    stwu r1, -32(r1)445; LARGE32-NEXT:    stw r0, 40(r1)446; LARGE32-NEXT:    addis r3, L..C1@u(r2)447; LARGE32-NEXT:    lwz r4, L..C1@l(r3)448; LARGE32-NEXT:    bla .__get_tpointer[PR]449; LARGE32-NEXT:    add r3, r3, r4450; LARGE32-NEXT:    lwz r5, 0(r3)451; LARGE32-NEXT:    lwz r3, 4(r3)452; LARGE32-NEXT:    addis r4, L..C4@u(r2)453; LARGE32-NEXT:    lwz r4, L..C4@l(r4)454; LARGE32-NEXT:    lwz r6, 0(r4)455; LARGE32-NEXT:    lwz r4, 4(r4)456; LARGE32-NEXT:    addc r4, r4, r3457; LARGE32-NEXT:    adde r3, r6, r5458; 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 @IThreadLocalVarInit)464  %1 = load i64, ptr %0, align 8465  %2 = load i64, ptr @VarInit, align 8466  %add = add nsw i64 %2, %1467  ret i64 %add468}469 470define i64 @loadTLUninit() {471; SMALL64-LABEL: loadTLUninit:472; SMALL64:       # %bb.0: # %entry473; SMALL64-NEXT:    ld r3, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit474; SMALL64-NEXT:    ldx r3, r13, r3475; SMALL64-NEXT:    blr476;477; LARGE64-LABEL: loadTLUninit:478; LARGE64:       # %bb.0: # %entry479; LARGE64-NEXT:    addis r3, L..C2@u(r2)480; LARGE64-NEXT:    ld r3, L..C2@l(r3)481; LARGE64-NEXT:    ldx r3, r13, r3482; LARGE64-NEXT:    blr483;484; SMALL32-LABEL: loadTLUninit:485; SMALL32:       # %bb.0: # %entry486; SMALL32-NEXT:    mflr r0487; SMALL32-NEXT:    stwu r1, -32(r1)488; SMALL32-NEXT:    lwz r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit489; SMALL32-NEXT:    bla .__get_tpointer[PR]490; SMALL32-NEXT:    stw r0, 40(r1)491; SMALL32-NEXT:    add r4, r3, r4492; SMALL32-NEXT:    lwz r3, 0(r4)493; SMALL32-NEXT:    lwz r4, 4(r4)494; SMALL32-NEXT:    addi r1, r1, 32495; SMALL32-NEXT:    lwz r0, 8(r1)496; SMALL32-NEXT:    mtlr r0497; SMALL32-NEXT:    blr498;499; LARGE32-LABEL: loadTLUninit:500; LARGE32:       # %bb.0: # %entry501; LARGE32-NEXT:    mflr r0502; LARGE32-NEXT:    stwu r1, -32(r1)503; LARGE32-NEXT:    stw r0, 40(r1)504; LARGE32-NEXT:    addis r3, L..C2@u(r2)505; LARGE32-NEXT:    lwz r4, L..C2@l(r3)506; LARGE32-NEXT:    bla .__get_tpointer[PR]507; LARGE32-NEXT:    add r4, r3, r4508; LARGE32-NEXT:    lwz r3, 0(r4)509; LARGE32-NEXT:    lwz r4, 4(r4)510; LARGE32-NEXT:    addi r1, r1, 32511; LARGE32-NEXT:    lwz r0, 8(r1)512; LARGE32-NEXT:    mtlr r0513; LARGE32-NEXT:    blr514entry:515  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarUninit)516  %1 = load i64, ptr %0, align 8517  ret i64 %1518}519 520define i64 @loadTLUninit2() {521; SMALL64-LABEL: loadTLUninit2:522; SMALL64:       # %bb.0: # %entry523; SMALL64-NEXT:    ld r3, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit524; SMALL64-NEXT:    ld r4, L..C4(r2) # @VarInit525; SMALL64-NEXT:    ldx r3, r13, r3526; SMALL64-NEXT:    ld r4, 0(r4)527; SMALL64-NEXT:    add r3, r4, r3528; SMALL64-NEXT:    blr529;530; LARGE64-LABEL: loadTLUninit2:531; LARGE64:       # %bb.0: # %entry532; LARGE64-NEXT:    addis r3, L..C2@u(r2)533; LARGE64-NEXT:    addis r4, L..C4@u(r2)534; LARGE64-NEXT:    ld r3, L..C2@l(r3)535; LARGE64-NEXT:    ld r4, L..C4@l(r4)536; LARGE64-NEXT:    ldx r3, r13, r3537; LARGE64-NEXT:    ld r4, 0(r4)538; LARGE64-NEXT:    add r3, r4, r3539; LARGE64-NEXT:    blr540;541; SMALL32-LABEL: loadTLUninit2:542; SMALL32:       # %bb.0: # %entry543; SMALL32-NEXT:    mflr r0544; SMALL32-NEXT:    stwu r1, -32(r1)545; SMALL32-NEXT:    lwz r4, L..C2(r2) # target-flags(ppc-tprel) @ThreadLocalVarUninit546; SMALL32-NEXT:    bla .__get_tpointer[PR]547; SMALL32-NEXT:    stw r0, 40(r1)548; SMALL32-NEXT:    add r3, r3, r4549; SMALL32-NEXT:    lwz r4, L..C4(r2) # @VarInit550; SMALL32-NEXT:    lwz r5, 0(r3)551; SMALL32-NEXT:    lwz r3, 4(r3)552; SMALL32-NEXT:    lwz r6, 0(r4)553; SMALL32-NEXT:    lwz r4, 4(r4)554; SMALL32-NEXT:    addc r4, r4, r3555; SMALL32-NEXT:    adde r3, r6, r5556; SMALL32-NEXT:    addi r1, r1, 32557; SMALL32-NEXT:    lwz r0, 8(r1)558; SMALL32-NEXT:    mtlr r0559; SMALL32-NEXT:    blr560;561; LARGE32-LABEL: loadTLUninit2:562; LARGE32:       # %bb.0: # %entry563; LARGE32-NEXT:    mflr r0564; LARGE32-NEXT:    stwu r1, -32(r1)565; LARGE32-NEXT:    stw r0, 40(r1)566; LARGE32-NEXT:    addis r3, L..C2@u(r2)567; LARGE32-NEXT:    lwz r4, L..C2@l(r3)568; LARGE32-NEXT:    bla .__get_tpointer[PR]569; LARGE32-NEXT:    add r3, r3, r4570; LARGE32-NEXT:    lwz r5, 0(r3)571; LARGE32-NEXT:    lwz r3, 4(r3)572; LARGE32-NEXT:    addis r4, L..C4@u(r2)573; LARGE32-NEXT:    lwz r4, L..C4@l(r4)574; LARGE32-NEXT:    lwz r6, 0(r4)575; LARGE32-NEXT:    lwz r4, 4(r4)576; LARGE32-NEXT:    addc r4, r4, r3577; LARGE32-NEXT:    adde r3, r6, r5578; LARGE32-NEXT:    addi r1, r1, 32579; LARGE32-NEXT:    lwz r0, 8(r1)580; LARGE32-NEXT:    mtlr r0581; LARGE32-NEXT:    blr582entry:583  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarUninit)584  %1 = load i64, ptr %0, align 8585  %2 = load i64, ptr @VarInit, align 8586  %add = add nsw i64 %2, %1587  ret i64 %add588}589 590define i64 @loadTLInit() {591; SMALL64-LABEL: loadTLInit:592; SMALL64:       # %bb.0: # %entry593; SMALL64-NEXT:    ld r3, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit594; SMALL64-NEXT:    ldx r3, r13, r3595; SMALL64-NEXT:    blr596;597; LARGE64-LABEL: loadTLInit:598; LARGE64:       # %bb.0: # %entry599; LARGE64-NEXT:    addis r3, L..C3@u(r2)600; LARGE64-NEXT:    ld r3, L..C3@l(r3)601; LARGE64-NEXT:    ldx r3, r13, r3602; LARGE64-NEXT:    blr603;604; SMALL32-LABEL: loadTLInit:605; SMALL32:       # %bb.0: # %entry606; SMALL32-NEXT:    mflr r0607; SMALL32-NEXT:    stwu r1, -32(r1)608; SMALL32-NEXT:    lwz r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit609; SMALL32-NEXT:    bla .__get_tpointer[PR]610; SMALL32-NEXT:    stw r0, 40(r1)611; SMALL32-NEXT:    add r4, r3, r4612; SMALL32-NEXT:    lwz r3, 0(r4)613; SMALL32-NEXT:    lwz r4, 4(r4)614; SMALL32-NEXT:    addi r1, r1, 32615; SMALL32-NEXT:    lwz r0, 8(r1)616; SMALL32-NEXT:    mtlr r0617; SMALL32-NEXT:    blr618;619; LARGE32-LABEL: loadTLInit:620; LARGE32:       # %bb.0: # %entry621; LARGE32-NEXT:    mflr r0622; LARGE32-NEXT:    stwu r1, -32(r1)623; LARGE32-NEXT:    stw r0, 40(r1)624; LARGE32-NEXT:    addis r3, L..C3@u(r2)625; LARGE32-NEXT:    lwz r4, L..C3@l(r3)626; LARGE32-NEXT:    bla .__get_tpointer[PR]627; LARGE32-NEXT:    add r4, r3, r4628; LARGE32-NEXT:    lwz r3, 0(r4)629; LARGE32-NEXT:    lwz r4, 4(r4)630; LARGE32-NEXT:    addi r1, r1, 32631; LARGE32-NEXT:    lwz r0, 8(r1)632; LARGE32-NEXT:    mtlr r0633; LARGE32-NEXT:    blr634entry:635  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)636  %1 = load i64, ptr %0, align 8637  ret i64 %1638}639 640define i64 @loadTLInit2() {641; SMALL64-LABEL: loadTLInit2:642; SMALL64:       # %bb.0: # %entry643; SMALL64-NEXT:    ld r3, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit644; SMALL64-NEXT:    ld r4, L..C4(r2) # @VarInit645; SMALL64-NEXT:    ldx r3, r13, r3646; SMALL64-NEXT:    ld r4, 0(r4)647; SMALL64-NEXT:    add r3, r4, r3648; SMALL64-NEXT:    blr649;650; LARGE64-LABEL: loadTLInit2:651; LARGE64:       # %bb.0: # %entry652; LARGE64-NEXT:    addis r3, L..C3@u(r2)653; LARGE64-NEXT:    addis r4, L..C4@u(r2)654; LARGE64-NEXT:    ld r3, L..C3@l(r3)655; LARGE64-NEXT:    ld r4, L..C4@l(r4)656; LARGE64-NEXT:    ldx r3, r13, r3657; LARGE64-NEXT:    ld r4, 0(r4)658; LARGE64-NEXT:    add r3, r4, r3659; LARGE64-NEXT:    blr660;661; SMALL32-LABEL: loadTLInit2:662; SMALL32:       # %bb.0: # %entry663; SMALL32-NEXT:    mflr r0664; SMALL32-NEXT:    stwu r1, -32(r1)665; SMALL32-NEXT:    lwz r4, L..C3(r2) # target-flags(ppc-tprel) @ThreadLocalVarInit666; SMALL32-NEXT:    bla .__get_tpointer[PR]667; SMALL32-NEXT:    stw r0, 40(r1)668; SMALL32-NEXT:    add r3, r3, r4669; SMALL32-NEXT:    lwz r4, L..C4(r2) # @VarInit670; SMALL32-NEXT:    lwz r5, 0(r3)671; SMALL32-NEXT:    lwz r3, 4(r3)672; SMALL32-NEXT:    lwz r6, 0(r4)673; SMALL32-NEXT:    lwz r4, 4(r4)674; SMALL32-NEXT:    addc r4, r4, r3675; SMALL32-NEXT:    adde r3, r6, r5676; SMALL32-NEXT:    addi r1, r1, 32677; SMALL32-NEXT:    lwz r0, 8(r1)678; SMALL32-NEXT:    mtlr r0679; SMALL32-NEXT:    blr680;681; LARGE32-LABEL: loadTLInit2:682; LARGE32:       # %bb.0: # %entry683; LARGE32-NEXT:    mflr r0684; LARGE32-NEXT:    stwu r1, -32(r1)685; LARGE32-NEXT:    stw r0, 40(r1)686; LARGE32-NEXT:    addis r3, L..C3@u(r2)687; LARGE32-NEXT:    lwz r4, L..C3@l(r3)688; LARGE32-NEXT:    bla .__get_tpointer[PR]689; LARGE32-NEXT:    add r3, r3, r4690; LARGE32-NEXT:    lwz r5, 0(r3)691; LARGE32-NEXT:    lwz r3, 4(r3)692; LARGE32-NEXT:    addis r4, L..C4@u(r2)693; LARGE32-NEXT:    lwz r4, L..C4@l(r4)694; LARGE32-NEXT:    lwz r6, 0(r4)695; LARGE32-NEXT:    lwz r4, 4(r4)696; LARGE32-NEXT:    addc r4, r4, r3697; LARGE32-NEXT:    adde r3, r6, r5698; LARGE32-NEXT:    addi r1, r1, 32699; LARGE32-NEXT:    lwz r0, 8(r1)700; LARGE32-NEXT:    mtlr r0701; LARGE32-NEXT:    blr702entry:703  %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @ThreadLocalVarInit)704  %1 = load i64, ptr %0, align 8705  %2 = load i64, ptr @VarInit, align 8706  %add = add nsw i64 %2, %1707  ret i64 %add708}709 710; TOC Entry Checks.711 712; SMALL64-LABEL: .toc713; SMALL64-LABEL: L..C0:714; SMALL64-NEXT: .tc IThreadLocalVarUninit[TC],IThreadLocalVarUninit[UL]@le715; SMALL64-LABEL: L..C1:716; SMALL64-NEXT: .tc IThreadLocalVarInit[TC],IThreadLocalVarInit[TL]@le717; SMALL64-LABEL: L..C2:718; SMALL64-NEXT: .tc ThreadLocalVarUninit[TC],ThreadLocalVarUninit[TL]@le719; SMALL64-LABEL: L..C3:720; SMALL64-NEXT: .tc ThreadLocalVarInit[TC],ThreadLocalVarInit[TL]@le721; SMALL64-LABEL: L..C4:722; SMALL64-NEXT: .tc VarInit[TC],VarInit[RW]723 724; LARGE64-LABEL: .toc725; LARGE64-LABEL: L..C0:726; LARGE64-NEXT: .tc IThreadLocalVarUninit[TE],IThreadLocalVarUninit[UL]@le727; LARGE64-LABEL: L..C1:728; LARGE64-NEXT: .tc IThreadLocalVarInit[TE],IThreadLocalVarInit[TL]@le729; LARGE64-LABEL: L..C2:730; LARGE64-NEXT: .tc ThreadLocalVarUninit[TE],ThreadLocalVarUninit[TL]@le731; LARGE64-LABEL: L..C3:732; LARGE64-NEXT: .tc ThreadLocalVarInit[TE],ThreadLocalVarInit[TL]@le733; LARGE64-LABEL: L..C4:734; LARGE64-NEXT: .tc VarInit[TE],VarInit[RW]735 736; SMALL32-LABEL: .toc737; SMALL32-LABEL: L..C0:738; SMALL32-NEXT: .tc IThreadLocalVarUninit[TC],IThreadLocalVarUninit[UL]@le739; SMALL32-LABEL: L..C1:740; SMALL32-NEXT: .tc IThreadLocalVarInit[TC],IThreadLocalVarInit[TL]@le741; SMALL32-LABEL: L..C2:742; SMALL32-NEXT: .tc ThreadLocalVarUninit[TC],ThreadLocalVarUninit[TL]@le743; SMALL32-LABEL: L..C3:744; SMALL32-NEXT: .tc ThreadLocalVarInit[TC],ThreadLocalVarInit[TL]@le745; SMALL32-LABEL: L..C4:746; SMALL32-NEXT: .tc VarInit[TC],VarInit[RW]747 748; LARGE32-LABEL: .toc749; LARGE32-LABEL: L..C0:750; LARGE32-NEXT: .tc IThreadLocalVarUninit[TE],IThreadLocalVarUninit[UL]@le751; LARGE32-LABEL: L..C1:752; LARGE32-NEXT: .tc IThreadLocalVarInit[TE],IThreadLocalVarInit[TL]@le753; LARGE32-LABEL: L..C2:754; LARGE32-NEXT: .tc ThreadLocalVarUninit[TE],ThreadLocalVarUninit[TL]@le755; LARGE32-LABEL: L..C3:756; LARGE32-NEXT: .tc ThreadLocalVarInit[TE],ThreadLocalVarInit[TL]@le757; LARGE32-LABEL: L..C4:758; LARGE32-NEXT: .tc VarInit[TE],VarInit[RW]759