brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.2 KiB · a06b61f Raw
674 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec \3; RUN:  -mtriple powerpc-ibm-aix-xcoff < %s | \4; RUN: FileCheck --check-prefixes=32BIT %s5 6; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec \7; RUN:  -mtriple powerpc64-ibm-aix-xcoff < %s | \8; RUN: FileCheck --check-prefixes=64BIT %s9 10%struct.S0 = type {}11 12%struct.S1 = type { [1 x i8] }13@gS1 = external global %struct.S1, align 114 15define void @call_test_byval_1Byte() {16; 32BIT-LABEL: call_test_byval_1Byte:17; 32BIT:       # %bb.0: # %entry18; 32BIT-NEXT:    mflr 019; 32BIT-NEXT:    stwu 1, -64(1)20; 32BIT-NEXT:    lwz 3, L..C0(2) # @gS121; 32BIT-NEXT:    stw 0, 72(1)22; 32BIT-NEXT:    lbz 3, 0(3)23; 32BIT-NEXT:    slwi 3, 3, 2424; 32BIT-NEXT:    bl .test_byval_1Byte25; 32BIT-NEXT:    nop26; 32BIT-NEXT:    addi 1, 1, 6427; 32BIT-NEXT:    lwz 0, 8(1)28; 32BIT-NEXT:    mtlr 029; 32BIT-NEXT:    blr30;31; 64BIT-LABEL: call_test_byval_1Byte:32; 64BIT:       # %bb.0: # %entry33; 64BIT-NEXT:    mflr 034; 64BIT-NEXT:    stdu 1, -128(1)35; 64BIT-NEXT:    ld 3, L..C0(2) # @gS136; 64BIT-NEXT:    std 0, 144(1)37; 64BIT-NEXT:    lbz 3, 0(3)38; 64BIT-NEXT:    sldi 3, 3, 5639; 64BIT-NEXT:    bl .test_byval_1Byte40; 64BIT-NEXT:    nop41; 64BIT-NEXT:    addi 1, 1, 12842; 64BIT-NEXT:    ld 0, 16(1)43; 64BIT-NEXT:    mtlr 044; 64BIT-NEXT:    blr45entry:46  %s0 = alloca %struct.S0, align 847  %call = call zeroext i8 @test_byval_1Byte(ptr byval(%struct.S0) align 1 %s0, ptr byval(%struct.S1) align 1 @gS1)48  ret void49}50 51define zeroext i8 @test_byval_1Byte(ptr byval(%struct.S0) align 1 %s0, ptr byval(%struct.S1) align 1 %s) {52; 32BIT-LABEL: test_byval_1Byte:53; 32BIT:       # %bb.0: # %entry54; 32BIT-NEXT:    mr 4, 355; 32BIT-NEXT:    srwi 3, 3, 2456; 32BIT-NEXT:    stw 4, 24(1)57; 32BIT-NEXT:    blr58;59; 64BIT-LABEL: test_byval_1Byte:60; 64BIT:       # %bb.0: # %entry61; 64BIT-NEXT:    mr 4, 362; 64BIT-NEXT:    rldicl 3, 3, 8, 5663; 64BIT-NEXT:    std 4, 48(1)64; 64BIT-NEXT:    blr65entry:66  %0 = load i8, ptr %s, align 167  ret i8 %068}69 70@f = common global float 0.000000e+00, align 471 72%struct.S2 = type { [2 x i8] }73 74@gS2 = external global %struct.S2, align 175 76define void @call_test_byval_2Byte() {77; 32BIT-LABEL: call_test_byval_2Byte:78; 32BIT:       # %bb.0: # %entry79; 32BIT-NEXT:    mflr 080; 32BIT-NEXT:    stwu 1, -64(1)81; 32BIT-NEXT:    lwz 3, L..C1(2) # @f82; 32BIT-NEXT:    stw 0, 72(1)83; 32BIT-NEXT:    li 7, 4384; 32BIT-NEXT:    lfs 1, 0(3)85; 32BIT-NEXT:    lwz 3, L..C2(2) # @gS286; 32BIT-NEXT:    lhz 3, 0(3)87; 32BIT-NEXT:    fmr 2, 188; 32BIT-NEXT:    slwi 5, 3, 1689; 32BIT-NEXT:    li 3, 4290; 32BIT-NEXT:    bl .test_byval_2Byte91; 32BIT-NEXT:    nop92; 32BIT-NEXT:    addi 1, 1, 6493; 32BIT-NEXT:    lwz 0, 8(1)94; 32BIT-NEXT:    mtlr 095; 32BIT-NEXT:    blr96;97; 64BIT-LABEL: call_test_byval_2Byte:98; 64BIT:       # %bb.0: # %entry99; 64BIT-NEXT:    mflr 0100; 64BIT-NEXT:    stdu 1, -112(1)101; 64BIT-NEXT:    ld 3, L..C1(2) # @f102; 64BIT-NEXT:    std 0, 128(1)103; 64BIT-NEXT:    li 7, 43104; 64BIT-NEXT:    lfs 1, 0(3)105; 64BIT-NEXT:    ld 3, L..C2(2) # @gS2106; 64BIT-NEXT:    lhz 3, 0(3)107; 64BIT-NEXT:    fmr 2, 1108; 64BIT-NEXT:    sldi 5, 3, 48109; 64BIT-NEXT:    li 3, 42110; 64BIT-NEXT:    bl .test_byval_2Byte111; 64BIT-NEXT:    nop112; 64BIT-NEXT:    addi 1, 1, 112113; 64BIT-NEXT:    ld 0, 16(1)114; 64BIT-NEXT:    mtlr 0115; 64BIT-NEXT:    blr116entry:117  %0 = load float, ptr @f, align 4118  %call = call zeroext i8 @test_byval_2Byte(i32 signext 42, float %0, ptr byval(%struct.S2) align 1 @gS2, float %0, i32 signext 43)119  ret void120}121 122define zeroext i8 @test_byval_2Byte(i32, float, ptr byval(%struct.S2) align 1 %s, float, i32) {123; 32BIT-LABEL: test_byval_2Byte:124; 32BIT:       # %bb.0: # %entry125; 32BIT-NEXT:    stw 5, 32(1)126; 32BIT-NEXT:    lbz 3, 33(1)127; 32BIT-NEXT:    blr128;129; 64BIT-LABEL: test_byval_2Byte:130; 64BIT:       # %bb.0: # %entry131; 64BIT-NEXT:    std 5, 64(1)132; 64BIT-NEXT:    lbz 3, 65(1)133; 64BIT-NEXT:    blr134entry:135  %arrayidx = getelementptr inbounds %struct.S2, ptr %s, i32 0, i32 0, i32 1136  %4 = load i8, ptr %arrayidx, align 1137  ret i8 %4138}139 140%struct.S3 = type <{ i8, i16 }>141@gS3 = external global %struct.S3, align 1142 143define void @call_test_byval_3Byte() {144; 32BIT-LABEL: call_test_byval_3Byte:145; 32BIT:       # %bb.0: # %entry146; 32BIT-NEXT:    mflr 0147; 32BIT-NEXT:    stwu 1, -64(1)148; 32BIT-NEXT:    lwz 4, L..C3(2) # @gS3149; 32BIT-NEXT:    li 3, 42150; 32BIT-NEXT:    stw 0, 72(1)151; 32BIT-NEXT:    li 5, 3152; 32BIT-NEXT:    li 6, 4153; 32BIT-NEXT:    li 7, 5154; 32BIT-NEXT:    stw 3, 56(1)155; 32BIT-NEXT:    li 8, 6156; 32BIT-NEXT:    li 9, 7157; 32BIT-NEXT:    lbz 3, 2(4)158; 32BIT-NEXT:    lhz 4, 0(4)159; 32BIT-NEXT:    rlwinm 10, 3, 8, 16, 23160; 32BIT-NEXT:    li 3, 1161; 32BIT-NEXT:    rlwimi 10, 4, 16, 0, 15162; 32BIT-NEXT:    li 4, 2163; 32BIT-NEXT:    bl .test_byval_3Byte164; 32BIT-NEXT:    nop165; 32BIT-NEXT:    addi 1, 1, 64166; 32BIT-NEXT:    lwz 0, 8(1)167; 32BIT-NEXT:    mtlr 0168; 32BIT-NEXT:    blr169;170; 64BIT-LABEL: call_test_byval_3Byte:171; 64BIT:       # %bb.0: # %entry172; 64BIT-NEXT:    mflr 0173; 64BIT-NEXT:    stdu 1, -128(1)174; 64BIT-NEXT:    ld 4, L..C3(2) # @gS3175; 64BIT-NEXT:    li 3, 42176; 64BIT-NEXT:    std 0, 144(1)177; 64BIT-NEXT:    li 5, 3178; 64BIT-NEXT:    li 6, 4179; 64BIT-NEXT:    li 7, 5180; 64BIT-NEXT:    std 3, 112(1)181; 64BIT-NEXT:    li 8, 6182; 64BIT-NEXT:    li 9, 7183; 64BIT-NEXT:    lbz 3, 2(4)184; 64BIT-NEXT:    lhz 4, 0(4)185; 64BIT-NEXT:    rldic 10, 3, 40, 16186; 64BIT-NEXT:    li 3, 1187; 64BIT-NEXT:    rldimi 10, 4, 48, 0188; 64BIT-NEXT:    li 4, 2189; 64BIT-NEXT:    bl .test_byval_3Byte190; 64BIT-NEXT:    nop191; 64BIT-NEXT:    addi 1, 1, 128192; 64BIT-NEXT:    ld 0, 16(1)193; 64BIT-NEXT:    mtlr 0194; 64BIT-NEXT:    blr195entry:196  %call = call zeroext i16 @test_byval_3Byte(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, ptr byval(%struct.S3) align 1 @gS3, i32 42)197  ret void198}199 200define zeroext i16 @test_byval_3Byte(i32, i32, i32, i32, i32, i32, i32, ptr byval(%struct.S3) align 1 %s, i32) {201; 32BIT-LABEL: test_byval_3Byte:202; 32BIT:       # %bb.0: # %entry203; 32BIT-NEXT:    stw 10, 52(1)204; 32BIT-NEXT:    lhz 3, 53(1)205; 32BIT-NEXT:    blr206;207; 64BIT-LABEL: test_byval_3Byte:208; 64BIT:       # %bb.0: # %entry209; 64BIT-NEXT:    std 10, 104(1)210; 64BIT-NEXT:    lhz 3, 105(1)211; 64BIT-NEXT:    blr212entry:213  %gep = getelementptr inbounds %struct.S3, ptr %s, i32 0, i32 1214  %8 = load i16, ptr %gep, align 1215  ret i16 %8216}217 218%struct.S4 = type { [4 x i8] }219%struct.S4A = type { i32 }220 221@gS4 = external global %struct.S4, align 1222 223define void @call_test_byval_4Byte() {224; 32BIT-LABEL: call_test_byval_4Byte:225; 32BIT:       # %bb.0: # %entry226; 32BIT-NEXT:    mflr 0227; 32BIT-NEXT:    stwu 1, -80(1)228; 32BIT-NEXT:    lwz 3, L..C4(2) # @gS4229; 32BIT-NEXT:    stw 0, 88(1)230; 32BIT-NEXT:    lwz 3, 0(3)231; 32BIT-NEXT:    lwz 4, 64(1)232; 32BIT-NEXT:    bl .test_byval_4Byte233; 32BIT-NEXT:    nop234; 32BIT-NEXT:    addi 1, 1, 80235; 32BIT-NEXT:    lwz 0, 8(1)236; 32BIT-NEXT:    mtlr 0237; 32BIT-NEXT:    blr238;239; 64BIT-LABEL: call_test_byval_4Byte:240; 64BIT:       # %bb.0: # %entry241; 64BIT-NEXT:    mflr 0242; 64BIT-NEXT:    stdu 1, -128(1)243; 64BIT-NEXT:    ld 3, L..C4(2) # @gS4244; 64BIT-NEXT:    std 0, 144(1)245; 64BIT-NEXT:    lwz 3, 0(3)246; 64BIT-NEXT:    lwz 4, 112(1)247; 64BIT-NEXT:    sldi 3, 3, 32248; 64BIT-NEXT:    sldi 4, 4, 32249; 64BIT-NEXT:    bl .test_byval_4Byte250; 64BIT-NEXT:    nop251; 64BIT-NEXT:    addi 1, 1, 128252; 64BIT-NEXT:    ld 0, 16(1)253; 64BIT-NEXT:    mtlr 0254; 64BIT-NEXT:    blr255entry:256  %s0 = alloca %struct.S0, align 8257  %s4a = alloca %struct.S4A, align 8258  %call = call signext i32 @test_byval_4Byte(ptr byval(%struct.S4) align 1 @gS4, ptr byval(%struct.S0) align 1 %s0, ptr byval(%struct.S4A) align 4 %s4a)259  ret void260}261 262define signext i32 @test_byval_4Byte(ptr byval(%struct.S4) align 1 %s, ptr byval(%struct.S0) align 1, ptr byval(%struct.S4A) align 4 %s4a) {263; 32BIT-LABEL: test_byval_4Byte:264; 32BIT:       # %bb.0: # %entry265; 32BIT-NEXT:    stw 3, 24(1)266; 32BIT-NEXT:    clrlwi 3, 3, 24267; 32BIT-NEXT:    add 3, 4, 3268; 32BIT-NEXT:    stw 4, 28(1)269; 32BIT-NEXT:    blr270;271; 64BIT-LABEL: test_byval_4Byte:272; 64BIT:       # %bb.0: # %entry273; 64BIT-NEXT:    std 3, 48(1)274; 64BIT-NEXT:    lbz 3, 51(1)275; 64BIT-NEXT:    std 4, 56(1)276; 64BIT-NEXT:    rldicl 4, 4, 32, 32277; 64BIT-NEXT:    add 3, 4, 3278; 64BIT-NEXT:    extsw 3, 3279; 64BIT-NEXT:    blr280entry:281  %arrayidx = getelementptr inbounds %struct.S4, ptr %s, i32 0, i32 0, i32 3282  %1 = load i8, ptr %arrayidx, align 1283  %2 = load i32, ptr %s4a, align 4284  %conv = zext i8 %1 to i32285  %add = add nsw i32 %2, %conv286  ret i32 %add287}288 289%struct.S5 = type { [5 x i8] }290 291@gS5 = external global %struct.S5, align 1292 293define void @call_test_byval_5Byte() {294; 32BIT-LABEL: call_test_byval_5Byte:295; 32BIT:       # %bb.0: # %entry296; 32BIT-NEXT:    mflr 0297; 32BIT-NEXT:    stwu 1, -64(1)298; 32BIT-NEXT:    lwz 3, L..C5(2) # @gS5299; 32BIT-NEXT:    stw 0, 72(1)300; 32BIT-NEXT:    lbz 4, 4(3)301; 32BIT-NEXT:    lwz 3, 0(3)302; 32BIT-NEXT:    slwi 4, 4, 24303; 32BIT-NEXT:    bl .test_byval_5Byte[PR]304; 32BIT-NEXT:    nop305; 32BIT-NEXT:    addi 1, 1, 64306; 32BIT-NEXT:    lwz 0, 8(1)307; 32BIT-NEXT:    mtlr 0308; 32BIT-NEXT:    blr309;310; 64BIT-LABEL: call_test_byval_5Byte:311; 64BIT:       # %bb.0: # %entry312; 64BIT-NEXT:    mflr 0313; 64BIT-NEXT:    stdu 1, -112(1)314; 64BIT-NEXT:    ld 3, L..C5(2) # @gS5315; 64BIT-NEXT:    std 0, 128(1)316; 64BIT-NEXT:    lbz 4, 4(3)317; 64BIT-NEXT:    lwz 5, 0(3)318; 64BIT-NEXT:    rlwinm 3, 4, 24, 0, 7319; 64BIT-NEXT:    rldimi 3, 5, 32, 0320; 64BIT-NEXT:    bl .test_byval_5Byte[PR]321; 64BIT-NEXT:    nop322; 64BIT-NEXT:    addi 1, 1, 112323; 64BIT-NEXT:    ld 0, 16(1)324; 64BIT-NEXT:    mtlr 0325; 64BIT-NEXT:    blr326entry:327  %call = call zeroext i8 @test_byval_5Byte(ptr byval(%struct.S5) align 1 @gS5)328  ret void329}330 331declare zeroext i8 @test_byval_5Byte(ptr byval(%struct.S5) align 1)332 333%struct.S6 = type { [6 x i8] }334 335@gS6 = external global %struct.S6, align 1336 337define void @call_test_byval_6Byte() {338; 32BIT-LABEL: call_test_byval_6Byte:339; 32BIT:       # %bb.0: # %entry340; 32BIT-NEXT:    mflr 0341; 32BIT-NEXT:    stwu 1, -64(1)342; 32BIT-NEXT:    lwz 3, L..C6(2) # @gS6343; 32BIT-NEXT:    stw 0, 72(1)344; 32BIT-NEXT:    lhz 4, 4(3)345; 32BIT-NEXT:    lwz 3, 0(3)346; 32BIT-NEXT:    slwi 4, 4, 16347; 32BIT-NEXT:    bl .test_byval_6Byte[PR]348; 32BIT-NEXT:    nop349; 32BIT-NEXT:    addi 1, 1, 64350; 32BIT-NEXT:    lwz 0, 8(1)351; 32BIT-NEXT:    mtlr 0352; 32BIT-NEXT:    blr353;354; 64BIT-LABEL: call_test_byval_6Byte:355; 64BIT:       # %bb.0: # %entry356; 64BIT-NEXT:    mflr 0357; 64BIT-NEXT:    stdu 1, -112(1)358; 64BIT-NEXT:    ld 3, L..C6(2) # @gS6359; 64BIT-NEXT:    std 0, 128(1)360; 64BIT-NEXT:    lhz 4, 4(3)361; 64BIT-NEXT:    lwz 5, 0(3)362; 64BIT-NEXT:    rlwinm 3, 4, 16, 0, 15363; 64BIT-NEXT:    rldimi 3, 5, 32, 0364; 64BIT-NEXT:    bl .test_byval_6Byte[PR]365; 64BIT-NEXT:    nop366; 64BIT-NEXT:    addi 1, 1, 112367; 64BIT-NEXT:    ld 0, 16(1)368; 64BIT-NEXT:    mtlr 0369; 64BIT-NEXT:    blr370entry:371  %call = call zeroext i8 @test_byval_6Byte(ptr byval(%struct.S6) align 1 @gS6)372  ret void373}374 375declare zeroext i8 @test_byval_6Byte(ptr byval(%struct.S6) align 1)376 377%struct.S7 = type { [7 x i8] }378 379@gS7 = external global %struct.S7, align 1380 381define void @call_test_byval_7Byte() {382; 32BIT-LABEL: call_test_byval_7Byte:383; 32BIT:       # %bb.0: # %entry384; 32BIT-NEXT:    mflr 0385; 32BIT-NEXT:    stwu 1, -64(1)386; 32BIT-NEXT:    lwz 3, L..C7(2) # @gS7387; 32BIT-NEXT:    stw 0, 72(1)388; 32BIT-NEXT:    lbz 4, 6(3)389; 32BIT-NEXT:    lhz 5, 4(3)390; 32BIT-NEXT:    rlwinm 4, 4, 8, 16, 23391; 32BIT-NEXT:    lwz 3, 0(3)392; 32BIT-NEXT:    rlwimi 4, 5, 16, 0, 15393; 32BIT-NEXT:    bl .test_byval_7Byte[PR]394; 32BIT-NEXT:    nop395; 32BIT-NEXT:    addi 1, 1, 64396; 32BIT-NEXT:    lwz 0, 8(1)397; 32BIT-NEXT:    mtlr 0398; 32BIT-NEXT:    blr399;400; 64BIT-LABEL: call_test_byval_7Byte:401; 64BIT:       # %bb.0: # %entry402; 64BIT-NEXT:    mflr 0403; 64BIT-NEXT:    stdu 1, -112(1)404; 64BIT-NEXT:    ld 3, L..C7(2) # @gS7405; 64BIT-NEXT:    std 0, 128(1)406; 64BIT-NEXT:    lbz 5, 6(3)407; 64BIT-NEXT:    lhz 4, 4(3)408; 64BIT-NEXT:    lwz 6, 0(3)409; 64BIT-NEXT:    rlwinm 3, 5, 8, 16, 23410; 64BIT-NEXT:    rlwimi 3, 4, 16, 0, 15411; 64BIT-NEXT:    rldimi 3, 6, 32, 0412; 64BIT-NEXT:    bl .test_byval_7Byte[PR]413; 64BIT-NEXT:    nop414; 64BIT-NEXT:    addi 1, 1, 112415; 64BIT-NEXT:    ld 0, 16(1)416; 64BIT-NEXT:    mtlr 0417; 64BIT-NEXT:    blr418entry:419  %call = call zeroext i8 @test_byval_7Byte(ptr byval(%struct.S7) align 1 @gS7)420  ret void421}422 423declare zeroext i8 @test_byval_7Byte(ptr byval(%struct.S7) align 1)424 425%struct.S8 = type { [8 x i8] }426 427@gS8 = external global %struct.S8, align 1428 429define void @call_test_byval_8Byte() {430; 32BIT-LABEL: call_test_byval_8Byte:431; 32BIT:       # %bb.0: # %entry432; 32BIT-NEXT:    mflr 0433; 32BIT-NEXT:    stwu 1, -64(1)434; 32BIT-NEXT:    lwz 3, L..C8(2) # @gS8435; 32BIT-NEXT:    stw 0, 72(1)436; 32BIT-NEXT:    lwz 4, 4(3)437; 32BIT-NEXT:    lwz 3, 0(3)438; 32BIT-NEXT:    bl .test_byval_8Byte[PR]439; 32BIT-NEXT:    nop440; 32BIT-NEXT:    addi 1, 1, 64441; 32BIT-NEXT:    lwz 0, 8(1)442; 32BIT-NEXT:    mtlr 0443; 32BIT-NEXT:    blr444;445; 64BIT-LABEL: call_test_byval_8Byte:446; 64BIT:       # %bb.0: # %entry447; 64BIT-NEXT:    mflr 0448; 64BIT-NEXT:    stdu 1, -112(1)449; 64BIT-NEXT:    ld 3, L..C8(2) # @gS8450; 64BIT-NEXT:    std 0, 128(1)451; 64BIT-NEXT:    ld 3, 0(3)452; 64BIT-NEXT:    bl .test_byval_8Byte[PR]453; 64BIT-NEXT:    nop454; 64BIT-NEXT:    addi 1, 1, 112455; 64BIT-NEXT:    ld 0, 16(1)456; 64BIT-NEXT:    mtlr 0457; 64BIT-NEXT:    blr458entry:459  %call = call zeroext i8 @test_byval_8Byte(ptr byval(%struct.S8) align 1 @gS8)460  ret void461}462 463declare zeroext i8 @test_byval_8Byte(ptr byval(%struct.S8) align 1)464 465%struct.S32 = type { [32 x i8] }466 467@gS32 = external global %struct.S32, align 1468 469define void @call_test_byval_32Byte() {470; 32BIT-LABEL: call_test_byval_32Byte:471; 32BIT:       # %bb.0: # %entry472; 32BIT-NEXT:    mflr 0473; 32BIT-NEXT:    stwu 1, -64(1)474; 32BIT-NEXT:    lwz 3, L..C9(2) # @gS32475; 32BIT-NEXT:    stw 0, 72(1)476; 32BIT-NEXT:    lwz 10, 28(3)477; 32BIT-NEXT:    lwz 9, 24(3)478; 32BIT-NEXT:    lwz 8, 20(3)479; 32BIT-NEXT:    lwz 7, 16(3)480; 32BIT-NEXT:    lwz 6, 12(3)481; 32BIT-NEXT:    lwz 5, 8(3)482; 32BIT-NEXT:    lwz 4, 4(3)483; 32BIT-NEXT:    lwz 3, 0(3)484; 32BIT-NEXT:    bl .test_byval_32Byte485; 32BIT-NEXT:    nop486; 32BIT-NEXT:    addi 1, 1, 64487; 32BIT-NEXT:    lwz 0, 8(1)488; 32BIT-NEXT:    mtlr 0489; 32BIT-NEXT:    blr490;491; 64BIT-LABEL: call_test_byval_32Byte:492; 64BIT:       # %bb.0: # %entry493; 64BIT-NEXT:    mflr 0494; 64BIT-NEXT:    stdu 1, -112(1)495; 64BIT-NEXT:    ld 3, L..C9(2) # @gS32496; 64BIT-NEXT:    std 0, 128(1)497; 64BIT-NEXT:    ld 6, 24(3)498; 64BIT-NEXT:    ld 5, 16(3)499; 64BIT-NEXT:    ld 4, 8(3)500; 64BIT-NEXT:    ld 3, 0(3)501; 64BIT-NEXT:    bl .test_byval_32Byte502; 64BIT-NEXT:    nop503; 64BIT-NEXT:    addi 1, 1, 112504; 64BIT-NEXT:    ld 0, 16(1)505; 64BIT-NEXT:    mtlr 0506; 64BIT-NEXT:    blr507entry:508  %call = call zeroext i8 @test_byval_32Byte(ptr byval(%struct.S32) align 1 @gS32)509  ret void510}511 512define zeroext i8 @test_byval_32Byte(ptr byval(%struct.S32) align 1 %s) {513; 32BIT-LABEL: test_byval_32Byte:514; 32BIT:       # %bb.0: # %entry515; 32BIT-NEXT:    stw 8, 44(1)516; 32BIT-NEXT:    stw 3, 24(1)517; 32BIT-NEXT:    lbz 3, 45(1)518; 32BIT-NEXT:    stw 4, 28(1)519; 32BIT-NEXT:    stw 5, 32(1)520; 32BIT-NEXT:    stw 6, 36(1)521; 32BIT-NEXT:    stw 7, 40(1)522; 32BIT-NEXT:    stw 9, 48(1)523; 32BIT-NEXT:    stw 10, 52(1)524; 32BIT-NEXT:    blr525;526; 64BIT-LABEL: test_byval_32Byte:527; 64BIT:       # %bb.0: # %entry528; 64BIT-NEXT:    std 5, 64(1)529; 64BIT-NEXT:    std 3, 48(1)530; 64BIT-NEXT:    lbz 3, 69(1)531; 64BIT-NEXT:    std 4, 56(1)532; 64BIT-NEXT:    std 6, 72(1)533; 64BIT-NEXT:    blr534entry:535  %arrayidx = getelementptr inbounds %struct.S32, ptr %s, i32 0, i32 0, i32 21536  %0 = load i8, ptr %arrayidx, align 1537  ret i8 %0538}539 540; The ByVal handling produces dead stores. See `LowerFormalArguments_AIX` for541; details on why.542 543%struct.S31 = type <{ float, i32, i64, double, i32, i16, i8 }>544 545@gS31 = external global %struct.S31, align 1546 547define void @call_test_byval_31Byte() {548; 32BIT-LABEL: call_test_byval_31Byte:549; 32BIT:       # %bb.0: # %entry550; 32BIT-NEXT:    mflr 0551; 32BIT-NEXT:    stwu 1, -64(1)552; 32BIT-NEXT:    lwz 3, L..C10(2) # @gS31553; 32BIT-NEXT:    stw 0, 72(1)554; 32BIT-NEXT:    lbz 10, 30(3)555; 32BIT-NEXT:    lhz 11, 28(3)556; 32BIT-NEXT:    rlwinm 10, 10, 8, 16, 23557; 32BIT-NEXT:    lwz 9, 24(3)558; 32BIT-NEXT:    rlwimi 10, 11, 16, 0, 15559; 32BIT-NEXT:    lwz 8, 20(3)560; 32BIT-NEXT:    lwz 7, 16(3)561; 32BIT-NEXT:    lwz 6, 12(3)562; 32BIT-NEXT:    lwz 5, 8(3)563; 32BIT-NEXT:    lwz 4, 4(3)564; 32BIT-NEXT:    lwz 3, 0(3)565; 32BIT-NEXT:    bl .test_byval_31Byte566; 32BIT-NEXT:    nop567; 32BIT-NEXT:    addi 1, 1, 64568; 32BIT-NEXT:    lwz 0, 8(1)569; 32BIT-NEXT:    mtlr 0570; 32BIT-NEXT:    blr571;572; 64BIT-LABEL: call_test_byval_31Byte:573; 64BIT:       # %bb.0: # %entry574; 64BIT-NEXT:    mflr 0575; 64BIT-NEXT:    stdu 1, -112(1)576; 64BIT-NEXT:    ld 3, L..C10(2) # @gS31577; 64BIT-NEXT:    std 0, 128(1)578; 64BIT-NEXT:    lbz 6, 30(3)579; 64BIT-NEXT:    lhz 7, 28(3)580; 64BIT-NEXT:    rlwinm 6, 6, 8, 16, 23581; 64BIT-NEXT:    lwz 8, 24(3)582; 64BIT-NEXT:    rlwimi 6, 7, 16, 0, 15583; 64BIT-NEXT:    ld 5, 16(3)584; 64BIT-NEXT:    rldimi 6, 8, 32, 0585; 64BIT-NEXT:    ld 4, 8(3)586; 64BIT-NEXT:    ld 3, 0(3)587; 64BIT-NEXT:    bl .test_byval_31Byte588; 64BIT-NEXT:    nop589; 64BIT-NEXT:    addi 1, 1, 112590; 64BIT-NEXT:    ld 0, 16(1)591; 64BIT-NEXT:    mtlr 0592; 64BIT-NEXT:    blr593entry:594  %call = call double @test_byval_31Byte(ptr byval(%struct.S31) align 1 @gS31)595  ret void596}597 598define double @test_byval_31Byte(ptr byval(%struct.S31) align 1 %s) {599; 32BIT-LABEL: test_byval_31Byte:600; 32BIT:       # %bb.0: # %entry601; 32BIT-NEXT:    stw 8, 44(1)602; 32BIT-NEXT:    stw 7, 40(1)603; 32BIT-NEXT:    lfd 1, 40(1)604; 32BIT-NEXT:    stw 3, 24(1)605; 32BIT-NEXT:    stw 4, 28(1)606; 32BIT-NEXT:    stw 5, 32(1)607; 32BIT-NEXT:    stw 6, 36(1)608; 32BIT-NEXT:    stw 9, 48(1)609; 32BIT-NEXT:    stw 10, 52(1)610; 32BIT-NEXT:    blr611;612; 64BIT-LABEL: test_byval_31Byte:613; 64BIT:       # %bb.0: # %entry614; 64BIT-NEXT:    std 5, 64(1)615; 64BIT-NEXT:    lfd 1, 64(1)616; 64BIT-NEXT:    std 3, 48(1)617; 64BIT-NEXT:    std 4, 56(1)618; 64BIT-NEXT:    std 6, 72(1)619; 64BIT-NEXT:    blr620entry:621  %gep = getelementptr inbounds %struct.S31, ptr %s, i32 0, i32 3622  %load = load double, ptr %gep, align 1623  ret double %load624}625 626%struct.F = type { float, float, float }627 628define i32 @call_test_byval_homogeneous_float_struct() {629; 32BIT-LABEL: call_test_byval_homogeneous_float_struct:630; 32BIT:       # %bb.0: # %entry631; 32BIT-NEXT:    mflr 0632; 32BIT-NEXT:    stwu 1, -80(1)633; 32BIT-NEXT:    li 3, 0634; 32BIT-NEXT:    stw 0, 88(1)635; 32BIT-NEXT:    stw 3, 72(1)636; 32BIT-NEXT:    stw 3, 68(1)637; 32BIT-NEXT:    lwz 5, 72(1)638; 32BIT-NEXT:    lwz 4, 68(1)639; 32BIT-NEXT:    stw 3, 64(1)640; 32BIT-NEXT:    bl .test_byval_homogeneous_float_struct[PR]641; 32BIT-NEXT:    nop642; 32BIT-NEXT:    addi 1, 1, 80643; 32BIT-NEXT:    lwz 0, 8(1)644; 32BIT-NEXT:    mtlr 0645; 32BIT-NEXT:    blr646;647; 64BIT-LABEL: call_test_byval_homogeneous_float_struct:648; 64BIT:       # %bb.0: # %entry649; 64BIT-NEXT:    mflr 0650; 64BIT-NEXT:    stdu 1, -128(1)651; 64BIT-NEXT:    li 3, 0652; 64BIT-NEXT:    std 0, 144(1)653; 64BIT-NEXT:    stw 3, 120(1)654; 64BIT-NEXT:    std 3, 112(1)655; 64BIT-NEXT:    lwz 3, 120(1)656; 64BIT-NEXT:    sldi 4, 3, 32657; 64BIT-NEXT:    li 3, 0658; 64BIT-NEXT:    bl .test_byval_homogeneous_float_struct[PR]659; 64BIT-NEXT:    nop660; 64BIT-NEXT:    addi 1, 1, 128661; 64BIT-NEXT:    ld 0, 16(1)662; 64BIT-NEXT:    mtlr 0663; 64BIT-NEXT:    blr664entry:665  %s = alloca %struct.F, align 8666  call void @llvm.memset.p0.i32(ptr align 4 %s, i8 0, i32 12, i1 false)667  %call = call i32 @test_byval_homogeneous_float_struct(ptr byval(%struct.F) align 4 %s)668  ret i32 %call669}670 671declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1 immarg)672 673declare i32 @test_byval_homogeneous_float_struct(ptr byval(%struct.F) align 4)674