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