brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.6 KiB · 9fcbe87 Raw
417 lines · plain
1; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \2; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names < %s \3; RUN:   | FileCheck %s --check-prefixes=CHECK-S,CHECK-ALL4; RUN: llc -verify-machineinstrs -target-abi=elfv2 -mtriple=powerpc64-- \5; RUN:   -mcpu=pwr10 -ppc-asm-full-reg-names < %s \6; RUN:   | FileCheck %s --check-prefixes=CHECK-S,CHECK-ALL7; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \8; RUN:   -mcpu=pwr9 -ppc-asm-full-reg-names < %s \9; RUN:   | FileCheck %s --check-prefixes=CHECK-P9,CHECK-ALL10 11@globalVar = common dso_local local_unnamed_addr global i32 0, align 412@externGlobalVar = external local_unnamed_addr global i32, align 413@indirectCall = common dso_local local_unnamed_addr global ptr null, align 814 15; This funcion needs to remain as noinline.16; The compiler needs to know this function is local but must be forced to call17; it. The only thing we really need to check here is that st_other=0 and18; so we make sure that there is no .localentry.19define dso_local signext i32 @localCall(i32 signext %a) local_unnamed_addr #0 {20; CHECK-ALL-LABEL: localCall:21; CHECK-S-NOT:   .localentry22; CHECK-S:         addi r3, r3, 523; CHECK-S-NEXT:    extsw r3, r324; CHECK-S-NEXT:    blr25entry:26  %add = add nsw i32 %a, 527  ret i32 %add28}29 30define dso_local signext i32 @DirectCallLocal1(i32 signext %a, i32 signext %b) local_unnamed_addr {31; CHECK-ALL-LABEL: DirectCallLocal1:32; CHECK-S:         .localentry     DirectCallLocal133; CHECK-S:       # %bb.0: # %entry34; CHECK-S-NEXT:    mflr r035; CHECK-S-NEXT:    std r0, 16(r1)36; CHECK-S-NEXT:    stdu r1, -32(r1)37; CHECK-S-NEXT:    .cfi_def_cfa_offset 3238; CHECK-S-NEXT:    .cfi_offset lr, 1639; CHECK-S-NEXT:    add r3, r4, r340; CHECK-S-NEXT:    extsw r3, r341; CHECK-S-NEXT:    bl localCall@notoc42; CHECK-S-NEXT:    plwz r4, globalVar@PCREL(0), 143; CHECK-S-NEXT:    mullw r3, r4, r344; CHECK-S-NEXT:    extsw r3, r345; CHECK-S-NEXT:    addi r1, r1, 3246; CHECK-S-NEXT:    ld r0, 16(r1)47; CHECK-S-NEXT:    mtlr r048; CHECK-S-NEXT:    blr49entry:50  %add = add nsw i32 %b, %a51  %call = tail call signext i32 @localCall(i32 signext %add)52  %0 = load i32, ptr @globalVar, align 453  %mul = mul nsw i32 %0, %call54  ret i32 %mul55}56 57define dso_local signext i32 @DirectCallLocal2(i32 signext %a, i32 signext %b) local_unnamed_addr {58; CHECK-ALL-LABEL: DirectCallLocal2:59; CHECK-S:         .localentry     DirectCallLocal260; CHECK-S:       # %bb.0: # %entry61; CHECK-S-NEXT:    mflr r062; CHECK-S-NEXT:    std r0, 16(r1)63; CHECK-S-NEXT:    stdu r1, -32(r1)64; CHECK-S-NEXT:    .cfi_def_cfa_offset 3265; CHECK-S-NEXT:    .cfi_offset lr, 1666; CHECK-S-NEXT:    add r3, r4, r367; CHECK-S-NEXT:    extsw r3, r368; CHECK-S-NEXT:    bl localCall@notoc69; CHECK-S-NEXT:    pld r4, externGlobalVar@got@pcrel(0), 170; CHECK-S-NEXT: .Lpcrel0:71; CHECK-S-NEXT:    .reloc .Lpcrel0-8,R_PPC64_PCREL_OPT,.-(.Lpcrel0-8)72; CHECK-S-NEXT:    lwz r4, 0(r4)73; CHECK-S-NEXT:    mullw r3, r4, r374; CHECK-S-NEXT:    extsw r3, r375; CHECK-S-NEXT:    addi r1, r1, 3276; CHECK-S-NEXT:    ld r0, 16(r1)77; CHECK-S-NEXT:    mtlr r078; CHECK-S-NEXT:    blr79entry:80  %add = add nsw i32 %b, %a81  %call = tail call signext i32 @localCall(i32 signext %add)82  %0 = load i32, ptr @externGlobalVar, align 483  %mul = mul nsw i32 %0, %call84  ret i32 %mul85}86 87define dso_local signext i32 @DirectCallLocalNoGlobal(i32 signext %a, i32 signext %b) local_unnamed_addr {88; CHECK-ALL-LABEL: DirectCallLocalNoGlobal:89; CHECK-S:         .localentry DirectCallLocalNoGlobal, 190; CHECK-S-NEXT:    # %bb.0: # %entry91; CHECK-S-NEXT:    mflr r092; CHECK-S-NEXT:    .cfi_def_cfa_offset 4893; CHECK-S-NEXT:    .cfi_offset lr, 1694; CHECK-S-NEXT:    .cfi_offset r30, -1695; CHECK-S-NEXT:    std r30, -16(r1) # 8-byte Folded Spill96; CHECK-S-NEXT:    std r0, 16(r1)97; CHECK-S-NEXT:    stdu r1, -48(r1)98; CHECK-S-NEXT:    mr r30, r499; CHECK-S-NEXT:    bl localCall@notoc100; CHECK-S-NEXT:    add r3, r3, r30101; CHECK-S-NEXT:    extsw r3, r3102; CHECK-S-NEXT:    addi r1, r1, 48103; CHECK-S-NEXT:    ld r0, 16(r1)104; CHECK-S-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload105; CHECK-S-NEXT:    mtlr r0106; CHECK-S-NEXT:    blr107entry:108  %call = tail call signext i32 @localCall(i32 signext %a)109  %add = add nsw i32 %call, %b110  ret i32 %add111}112 113define dso_local signext i32 @DirectCallExtern1(i32 signext %a, i32 signext %b) local_unnamed_addr {114; CHECK-ALL-LABEL: DirectCallExtern1:115; CHECK-S:         .localentry     DirectCallExtern1116; CHECK-S:       # %bb.0: # %entry117; CHECK-S-NEXT:    mflr r0118; CHECK-S-NEXT:    std r0, 16(r1)119; CHECK-S-NEXT:    stdu r1, -32(r1)120; CHECK-S-NEXT:    .cfi_def_cfa_offset 32121; CHECK-S-NEXT:    .cfi_offset lr, 16122; CHECK-S-NEXT:    add r3, r4, r3123; CHECK-S-NEXT:    extsw r3, r3124; CHECK-S-NEXT:    bl externCall@notoc125; CHECK-S-NEXT:    plwz r4, globalVar@PCREL(0), 1126; CHECK-S-NEXT:    mullw r3, r4, r3127; CHECK-S-NEXT:    extsw r3, r3128; CHECK-S-NEXT:    addi r1, r1, 32129; CHECK-S-NEXT:    ld r0, 16(r1)130; CHECK-S-NEXT:    mtlr r0131; CHECK-S-NEXT:    blr132entry:133  %add = add nsw i32 %b, %a134  %call = tail call signext i32 @externCall(i32 signext %add)135  %0 = load i32, ptr @globalVar, align 4136  %mul = mul nsw i32 %0, %call137  ret i32 %mul138}139 140declare signext i32 @externCall(i32 signext) local_unnamed_addr141 142define dso_local signext i32 @DirectCallExtern2(i32 signext %a, i32 signext %b) local_unnamed_addr {143; CHECK-ALL-LABEL: DirectCallExtern2:144; CHECK-S:         .localentry     DirectCallExtern2145; CHECK-S:       # %bb.0: # %entry146; CHECK-S-NEXT:    mflr r0147; CHECK-S-NEXT:    std r0, 16(r1)148; CHECK-S-NEXT:    stdu r1, -32(r1)149; CHECK-S-NEXT:    .cfi_def_cfa_offset 32150; CHECK-S-NEXT:    .cfi_offset lr, 16151; CHECK-S-NEXT:    add r3, r4, r3152; CHECK-S-NEXT:    extsw r3, r3153; CHECK-S-NEXT:    bl externCall@notoc154; CHECK-S-NEXT:    pld r4, externGlobalVar@got@pcrel(0), 1155; CHECK-S-NEXT:  .Lpcrel1:156; CHECK-S-NEXT:    .reloc .Lpcrel1-8,R_PPC64_PCREL_OPT,.-(.Lpcrel1-8)157; CHECK-S-NEXT:    lwz r4, 0(r4)158; CHECK-S-NEXT:    mullw r3, r4, r3159; CHECK-S-NEXT:    extsw r3, r3160; CHECK-S-NEXT:    addi r1, r1, 32161; CHECK-S-NEXT:    ld r0, 16(r1)162; CHECK-S-NEXT:    mtlr r0163; CHECK-S-NEXT:    blr164entry:165  %add = add nsw i32 %b, %a166  %call = tail call signext i32 @externCall(i32 signext %add)167  %0 = load i32, ptr @externGlobalVar, align 4168  %mul = mul nsw i32 %0, %call169  ret i32 %mul170}171 172define dso_local signext i32 @DirectCallExternNoGlobal(i32 signext %a, i32 signext %b) local_unnamed_addr {173; CHECK-ALL-LABEL: DirectCallExternNoGlobal:174; CHECK-S:         .localentry DirectCallExternNoGlobal, 1175; CHECK-P9:        .localentry DirectCallExternNoGlobal, .Lfunc_lep6-.Lfunc_gep6176; CHECK-ALL:       # %bb.0: # %entry177; CHECK-S-NEXT:    mflr r0178; CHECK-S-NEXT:    .cfi_def_cfa_offset 48179; CHECK-S-NEXT:    .cfi_offset lr, 16180; CHECK-S-NEXT:    .cfi_offset r30, -16181; CHECK-S-NEXT:    std r30, -16(r1) # 8-byte Folded Spill182; CHECK-S-NEXT:    std r0, 16(r1)183; CHECK-S-NEXT:    stdu r1, -48(r1)184; CHECK-S-NEXT:    mr r30, r4185; CHECK-S-NEXT:    bl externCall@notoc186; CHECK-S-NEXT:    add r3, r3, r30187; CHECK-S-NEXT:    extsw r3, r3188; CHECK-S-NEXT:    addi r1, r1, 48189; CHECK-S-NEXT:    ld r0, 16(r1)190; CHECK-S-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload191; CHECK-S-NEXT:    mtlr r0192; CHECK-S-NEXT:    blr193entry:194  %call = tail call signext i32 @externCall(i32 signext %a)195  %add = add nsw i32 %call, %b196  ret i32 %add197}198 199define dso_local signext i32 @TailCallLocal1(i32 signext %a) local_unnamed_addr {200; CHECK-ALL-LABEL: TailCallLocal1:201; CHECK-S:         .localentry     TailCallLocal1202; CHECK-S:       # %bb.0: # %entry203; CHECK-S:         plwz r4, globalVar@PCREL(0), 1204; CHECK-S-NEXT:    add r3, r4, r3205; CHECK-S-NEXT:    extsw r3, r3206; CHECK-S-NEXT:    b localCall@notoc207entry:208  %0 = load i32, ptr @globalVar, align 4209  %add = add nsw i32 %0, %a210  %call = tail call signext i32 @localCall(i32 signext %add)211  ret i32 %call212}213 214define dso_local signext i32 @TailCallLocal2(i32 signext %a) local_unnamed_addr {215; CHECK-ALL-LABEL: TailCallLocal2:216; CHECK-S:         .localentry     TailCallLocal2217; CHECK-S:       # %bb.0: # %entry218; CHECK-S:         pld r4, externGlobalVar@got@pcrel(0), 1219; CHECK-S-NEXT:  .Lpcrel2:220; CHECK-S-NEXT:    .reloc .Lpcrel2-8,R_PPC64_PCREL_OPT,.-(.Lpcrel2-8)221; CHECK-S-NEXT:    lwz r4, 0(r4)222; CHECK-S-NEXT:    add r3, r4, r3223; CHECK-S-NEXT:    extsw r3, r3224; CHECK-S-NEXT:    b localCall@notoc225entry:226  %0 = load i32, ptr @externGlobalVar, align 4227  %add = add nsw i32 %0, %a228  %call = tail call signext i32 @localCall(i32 signext %add)229  ret i32 %call230}231 232define dso_local signext i32 @TailCallLocalNoGlobal(i32 signext %a) local_unnamed_addr {233; CHECK-ALL-LABEL: TailCallLocalNoGlobal:234; CHECK-S:         .localentry TailCallLocalNoGlobal, 1235; CHECK-P9:        .localentry TailCallLocalNoGlobal, .Lfunc_lep9-.Lfunc_gep9236; CHECK-ALL:       # %bb.0: # %entry237; CHECK-S:         b localCall@notoc238entry:239  %call = tail call signext i32 @localCall(i32 signext %a)240  ret i32 %call241}242 243define dso_local signext i32 @TailCallExtern1(i32 signext %a) local_unnamed_addr {244; CHECK-ALL-LABEL: TailCallExtern1:245; CHECK-S:         .localentry     TailCallExtern1246; CHECK-S:       # %bb.0: # %entry247; CHECK-S:         plwz r4, globalVar@PCREL(0), 1248; CHECK-S-NEXT:    add r3, r4, r3249; CHECK-S-NEXT:    extsw r3, r3250; CHECK-S-NEXT:    b externCall@notoc251entry:252  %0 = load i32, ptr @globalVar, align 4253  %add = add nsw i32 %0, %a254  %call = tail call signext i32 @externCall(i32 signext %add)255  ret i32 %call256}257 258define dso_local signext i32 @TailCallExtern2(i32 signext %a) local_unnamed_addr {259; CHECK-ALL-LABEL: TailCallExtern2:260; CHECK-S:         .localentry     TailCallExtern2261; CHECK-S:       # %bb.0: # %entry262; CHECK-S:         pld r4, externGlobalVar@got@pcrel(0), 1263; CHECK-S-NEXT:  .Lpcrel3:264; CHECK-S-NEXT:    .reloc .Lpcrel3-8,R_PPC64_PCREL_OPT,.-(.Lpcrel3-8)265; CHECK-S-NEXT:    lwz r4, 0(r4)266; CHECK-S-NEXT:    add r3, r4, r3267; CHECK-S-NEXT:    extsw r3, r3268; CHECK-S-NEXT:    b externCall@notoc269entry:270  %0 = load i32, ptr @externGlobalVar, align 4271  %add = add nsw i32 %0, %a272  %call = tail call signext i32 @externCall(i32 signext %add)273  ret i32 %call274}275 276define dso_local signext i32 @TailCallExternNoGlobal(i32 signext %a) local_unnamed_addr {277; CHECK-ALL-LABEL: TailCallExternNoGlobal:278; CHECK-S:         .localentry TailCallExternNoGlobal, 1279; CHECK-S-NEXT:  # %bb.0: # %entry280; CHECK-S-NEXT:    b externCall@notoc281; CHECK-S-NEXT:    #TC_RETURNd8 externCall@notoc282entry:283  %call = tail call signext i32 @externCall(i32 signext %a)284  ret i32 %call285}286 287define dso_local signext i32 @IndirectCall1(i32 signext %a, i32 signext %b) local_unnamed_addr {288; CHECK-ALL-LABEL: IndirectCall1:289; CHECK-S:       # %bb.0: # %entry290; CHECK-S-NEXT:    mflr r0291; CHECK-S-NEXT:    std r0, 16(r1)292; CHECK-S-NEXT:    stdu r1, -32(r1)293; CHECK-S-NEXT:    .cfi_def_cfa_offset 32294; CHECK-S-NEXT:    .cfi_offset lr, 16295; CHECK-S-NEXT:    pld r12, indirectCall@PCREL(0), 1296; CHECK-S-NEXT:    add r3, r4, r3297; CHECK-S-NEXT:    extsw r3, r3298; CHECK-S-NEXT:    mtctr r12299; CHECK-S-NEXT:    bctrl300; CHECK-S-NEXT:    plwz r4, globalVar@PCREL(0), 1301; CHECK-S-NEXT:    mullw r3, r4, r3302; CHECK-S-NEXT:    extsw r3, r3303; CHECK-S-NEXT:    addi r1, r1, 32304; CHECK-S-NEXT:    ld r0, 16(r1)305; CHECK-S-NEXT:    mtlr r0306; CHECK-S-NEXT:    blr307entry:308  %add = add nsw i32 %b, %a309  %0 = load ptr, ptr @indirectCall, align 8310  %call = tail call signext i32 %0(i32 signext %add)311  %1 = load i32, ptr @globalVar, align 4312  %mul = mul nsw i32 %1, %call313  ret i32 %mul314}315 316define dso_local signext i32 @IndirectCall2(i32 signext %a, i32 signext %b) local_unnamed_addr {317; CHECK-ALL-LABEL: IndirectCall2:318; CHECK-S:       # %bb.0: # %entry319; CHECK-S-NEXT:    mflr r0320; CHECK-S-NEXT:    std r0, 16(r1)321; CHECK-S-NEXT:    stdu r1, -32(r1)322; CHECK-S-NEXT:    .cfi_def_cfa_offset 32323; CHECK-S-NEXT:    .cfi_offset lr, 16324; CHECK-S-NEXT:    pld r12, indirectCall@PCREL(0), 1325; CHECK-S-NEXT:    add r3, r4, r3326; CHECK-S-NEXT:    extsw r3, r3327; CHECK-S-NEXT:    mtctr r12328; CHECK-S-NEXT:    bctrl329; CHECK-S-NEXT:    pld r4, externGlobalVar@got@pcrel(0), 1330; CHECK-S-NEXT:  .Lpcrel4:331; CHECK-S-NEXT:    .reloc .Lpcrel4-8,R_PPC64_PCREL_OPT,.-(.Lpcrel4-8)332; CHECK-S-NEXT:    lwz r4, 0(r4)333; CHECK-S-NEXT:    mullw r3, r4, r3334; CHECK-S-NEXT:    extsw r3, r3335; CHECK-S-NEXT:    addi r1, r1, 32336; CHECK-S-NEXT:    ld r0, 16(r1)337; CHECK-S-NEXT:    mtlr r0338; CHECK-S-NEXT:    blr339entry:340  %add = add nsw i32 %b, %a341  %0 = load ptr, ptr @indirectCall, align 8342  %call = tail call signext i32 %0(i32 signext %add)343  %1 = load i32, ptr @externGlobalVar, align 4344  %mul = mul nsw i32 %1, %call345  ret i32 %mul346}347 348define dso_local signext i32 @IndirectCall3(i32 signext %a, i32 signext %b, ptr nocapture %call_param) local_unnamed_addr {349; CHECK-ALL-LABEL: IndirectCall3:350; CHECK-S:       # %bb.0: # %entry351; CHECK-S-NEXT:    mflr r0352; CHECK-S-NEXT:    std r0, 16(r1)353; CHECK-S-NEXT:    stdu r1, -32(r1)354; CHECK-S-NEXT:    .cfi_def_cfa_offset 32355; CHECK-S-NEXT:    .cfi_offset lr, 16356; CHECK-S-NEXT:    add r3, r4, r3357; CHECK-S-NEXT:    mr r12, r5358; CHECK-S-NEXT:    mtctr r5359; CHECK-S-NEXT:    extsw r3, r3360; CHECK-S-NEXT:    bctrl361; CHECK-S-NEXT:    plwz r4, globalVar@PCREL(0), 1362; CHECK-S-NEXT:    mullw r3, r4, r3363; CHECK-S-NEXT:    extsw r3, r3364; CHECK-S-NEXT:    addi r1, r1, 32365; CHECK-S-NEXT:    ld r0, 16(r1)366; CHECK-S-NEXT:    mtlr r0367; CHECK-S-NEXT:    blr368entry:369  %add = add nsw i32 %b, %a370  %call = tail call signext i32 %call_param(i32 signext %add)371  %0 = load i32, ptr @globalVar, align 4372  %mul = mul nsw i32 %0, %call373  ret i32 %mul374}375 376define dso_local signext i32 @IndirectCallNoGlobal(i32 signext %a, i32 signext %b, ptr nocapture %call_param) local_unnamed_addr {377; CHECK-ALL-LABEL: IndirectCallNoGlobal:378; CHECK-S:       # %bb.0: # %entry379; CHECK-S-NEXT:    mflr r0380; CHECK-S-NEXT:    .cfi_def_cfa_offset 48381; CHECK-S-NEXT:    .cfi_offset lr, 16382; CHECK-S-NEXT:    .cfi_offset r30, -16383; CHECK-S-NEXT:    std r30, -16(r1) # 8-byte Folded Spill384; CHECK-S-NEXT:    std r0, 16(r1)385; CHECK-S-NEXT:    stdu r1, -48(r1)386; CHECK-S-NEXT:    mr r12, r5387; CHECK-S-NEXT:    mtctr r5388; CHECK-S-NEXT:    mr r30, r4389; CHECK-S-NEXT:    bctrl390; CHECK-S-NEXT:    add r3, r3, r30391; CHECK-S-NEXT:    extsw r3, r3392; CHECK-S-NEXT:    addi r1, r1, 48393; CHECK-S-NEXT:    ld r0, 16(r1)394; CHECK-S-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload395; CHECK-S-NEXT:    mtlr r0396; CHECK-S-NEXT:    blr397entry:398  %call = tail call signext i32 %call_param(i32 signext %a)399  %add = add nsw i32 %call, %b400  ret i32 %add401}402 403define dso_local signext i32 @IndirectCallOnly(i32 signext %a, ptr nocapture %call_param) local_unnamed_addr {404; CHECK-ALL-LABEL: IndirectCallOnly:405; CHECK-S:       # %bb.0: # %entry406; CHECK-S-NEXT:    mtctr r4407; CHECK-S-NEXT:    mr r12, r4408; CHECK-S-NEXT:    bctr409; CHECK-S-NEXT:    #TC_RETURNr8 ctr410entry:411  %call = tail call signext i32 %call_param(i32 signext %a)412  ret i32 %call413}414 415attributes #0 = { noinline }416 417