520 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -verify-machineinstrs -mcpu=ppc -mtriple=powerpc64-ibm-aix < %s | FileCheck -check-prefix=AIX64 %s3; RUN: llc -verify-machineinstrs -mcpu=ppc -mtriple=powerpc-ibm-aix < %s | FileCheck -check-prefix=AIX32 %s4; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck -check-prefix=LE64 %s5 6define signext i32 @leaf1_noredzone(i32 signext %a, i32 signext %b) #0 {7; AIX64-LABEL: leaf1_noredzone:8; AIX64: # %bb.0: # %entry9; AIX64-NEXT: stdu 1, -64(1)10; AIX64-NEXT: stw 3, 60(1)11; AIX64-NEXT: add 3, 3, 412; AIX64-NEXT: extsw 3, 313; AIX64-NEXT: stw 4, 56(1)14; AIX64-NEXT: addi 1, 1, 6415; AIX64-NEXT: blr16;17; AIX32-LABEL: leaf1_noredzone:18; AIX32: # %bb.0: # %entry19; AIX32-NEXT: stwu 1, -32(1)20; AIX32-NEXT: stw 3, 28(1)21; AIX32-NEXT: add 3, 3, 422; AIX32-NEXT: stw 4, 24(1)23; AIX32-NEXT: addi 1, 1, 3224; AIX32-NEXT: blr25;26; LE64-LABEL: leaf1_noredzone:27; LE64: # %bb.0: # %entry28; LE64-NEXT: stdu 1, -48(1)29; LE64-NEXT: stw 3, 44(1)30; LE64-NEXT: add 3, 3, 431; LE64-NEXT: stw 4, 40(1)32; LE64-NEXT: extsw 3, 333; LE64-NEXT: addi 1, 1, 4834; LE64-NEXT: blr35entry:36 %a.addr = alloca i32, align 437 %b.addr = alloca i32, align 438 store i32 %a, ptr %a.addr, align 439 store i32 %b, ptr %b.addr, align 440 %0 = load i32, ptr %a.addr, align 441 %1 = load i32, ptr %b.addr, align 442 %add = add nsw i32 %0, %143 ret i32 %add44}45 46define void @nonleaf1_noredzone(i32 signext %a, i32 signext %b) #0 {47; AIX64-LABEL: nonleaf1_noredzone:48; AIX64: # %bb.0: # %entry49; AIX64-NEXT: mflr 050; AIX64-NEXT: stdu 1, -128(1)51; AIX64-NEXT: std 0, 144(1)52; AIX64-NEXT: stw 3, 124(1)53; AIX64-NEXT: add 3, 3, 454; AIX64-NEXT: extsw 3, 355; AIX64-NEXT: stw 4, 120(1)56; AIX64-NEXT: bl .leaf2[PR]57; AIX64-NEXT: nop58; AIX64-NEXT: lwz 3, 124(1)59; AIX64-NEXT: lwz 4, 120(1)60; AIX64-NEXT: sub 3, 3, 461; AIX64-NEXT: extsw 3, 362; AIX64-NEXT: bl .leaf2[PR]63; AIX64-NEXT: nop64; AIX64-NEXT: addi 1, 1, 12865; AIX64-NEXT: ld 0, 16(1)66; AIX64-NEXT: mtlr 067; AIX64-NEXT: blr68;69; AIX32-LABEL: nonleaf1_noredzone:70; AIX32: # %bb.0: # %entry71; AIX32-NEXT: mflr 072; AIX32-NEXT: stwu 1, -64(1)73; AIX32-NEXT: stw 0, 72(1)74; AIX32-NEXT: stw 3, 60(1)75; AIX32-NEXT: add 3, 3, 476; AIX32-NEXT: stw 4, 56(1)77; AIX32-NEXT: bl .leaf2[PR]78; AIX32-NEXT: nop79; AIX32-NEXT: lwz 3, 60(1)80; AIX32-NEXT: lwz 4, 56(1)81; AIX32-NEXT: sub 3, 3, 482; AIX32-NEXT: bl .leaf2[PR]83; AIX32-NEXT: nop84; AIX32-NEXT: addi 1, 1, 6485; AIX32-NEXT: lwz 0, 8(1)86; AIX32-NEXT: mtlr 087; AIX32-NEXT: blr88;89; LE64-LABEL: nonleaf1_noredzone:90; LE64: # %bb.0: # %entry91; LE64-NEXT: mflr 092; LE64-NEXT: stdu 1, -48(1)93; LE64-NEXT: std 0, 64(1)94; LE64-NEXT: stw 3, 44(1)95; LE64-NEXT: add 3, 3, 496; LE64-NEXT: extsw 3, 397; LE64-NEXT: stw 4, 40(1)98; LE64-NEXT: bl leaf299; LE64-NEXT: nop100; LE64-NEXT: lwz 3, 44(1)101; LE64-NEXT: lwz 4, 40(1)102; LE64-NEXT: sub 3, 3, 4103; LE64-NEXT: extsw 3, 3104; LE64-NEXT: bl leaf2105; LE64-NEXT: nop106; LE64-NEXT: addi 1, 1, 48107; LE64-NEXT: ld 0, 16(1)108; LE64-NEXT: mtlr 0109; LE64-NEXT: blr110entry:111 %a.addr = alloca i32, align 4112 %b.addr = alloca i32, align 4113 store i32 %a, ptr %a.addr, align 4114 store i32 %b, ptr %b.addr, align 4115 %0 = load i32, ptr %a.addr, align 4116 %1 = load i32, ptr %b.addr, align 4117 %add = add nsw i32 %0, %1118 call void @leaf2(i32 signext %add)119 %2 = load i32, ptr %a.addr, align 4120 %3 = load i32, ptr %b.addr, align 4121 %sub = sub nsw i32 %2, %3122 call void @leaf2(i32 signext %sub)123 ret void124}125 126declare void @leaf2(i32 signext)127 128define signext i32 @leaf3_noredzone(i32 signext %a, i32 signext %b) #0 {129; AIX64-LABEL: leaf3_noredzone:130; AIX64: # %bb.0: # %entry131; AIX64-NEXT: stdu 1, -48(1)132; AIX64-NEXT: ld 6, 0(1)133; AIX64-NEXT: mr 5, 3134; AIX64-NEXT: add 3, 5, 4135; AIX64-NEXT: extsw 3, 3136; AIX64-NEXT: stw 5, 48(6)137; AIX64-NEXT: stw 4, 52(6)138; AIX64-NEXT: addi 1, 1, 48139; AIX64-NEXT: blr140;141; AIX32-LABEL: leaf3_noredzone:142; AIX32: # %bb.0: # %entry143; AIX32-NEXT: stwu 1, -32(1)144; AIX32-NEXT: lwz 6, 0(1)145; AIX32-NEXT: mr 5, 3146; AIX32-NEXT: add 3, 3, 4147; AIX32-NEXT: stw 5, 24(6)148; AIX32-NEXT: stw 4, 28(6)149; AIX32-NEXT: addi 1, 1, 32150; AIX32-NEXT: blr151;152; LE64-LABEL: leaf3_noredzone:153; LE64: # %bb.0: # %entry154; LE64-NEXT: stdu 1, -32(1)155; LE64-NEXT: ld 5, 0(1)156; LE64-NEXT: stw 3, 48(5)157; LE64-NEXT: add 3, 3, 4158; LE64-NEXT: stw 4, 52(5)159; LE64-NEXT: extsw 3, 3160; LE64-NEXT: addi 1, 1, 32161; LE64-NEXT: blr162entry:163 %f.addr = call ptr @llvm.frameaddress(i32 1)164 %a.addr = getelementptr ptr, ptr %f.addr, i32 6165 %b.addr = getelementptr i32, ptr %a.addr, i32 1166 store i32 %a, ptr %a.addr, align 4167 store i32 %b, ptr %b.addr, align 4168 %0 = load i32, ptr %a.addr, align 4169 %1 = load i32, ptr %b.addr, align 4170 %add = add nsw i32 %0, %1171 ret i32 %add172}173 174define void @nonleaf2_noredzone(i32 signext %a, i32 signext %b) #0 {175; AIX64-LABEL: nonleaf2_noredzone:176; AIX64: # %bb.0: # %entry177; AIX64-NEXT: mflr 0178; AIX64-NEXT: stdu 1, -128(1)179; AIX64-NEXT: std 0, 144(1)180; AIX64-NEXT: std 31, 120(1) # 8-byte Folded Spill181; AIX64-NEXT: add 5, 3, 4182; AIX64-NEXT: ld 31, 0(1)183; AIX64-NEXT: extsw 5, 5184; AIX64-NEXT: stw 3, 48(31)185; AIX64-NEXT: mr 3, 5186; AIX64-NEXT: stw 4, 52(31)187; AIX64-NEXT: bl .leaf2[PR]188; AIX64-NEXT: nop189; AIX64-NEXT: lwz 3, 48(31)190; AIX64-NEXT: lwz 4, 52(31)191; AIX64-NEXT: sub 3, 3, 4192; AIX64-NEXT: extsw 3, 3193; AIX64-NEXT: bl .leaf2[PR]194; AIX64-NEXT: nop195; AIX64-NEXT: ld 31, 120(1) # 8-byte Folded Reload196; AIX64-NEXT: addi 1, 1, 128197; AIX64-NEXT: ld 0, 16(1)198; AIX64-NEXT: mtlr 0199; AIX64-NEXT: blr200;201; AIX32-LABEL: nonleaf2_noredzone:202; AIX32: # %bb.0: # %entry203; AIX32-NEXT: mflr 0204; AIX32-NEXT: stwu 1, -64(1)205; AIX32-NEXT: stw 0, 72(1)206; AIX32-NEXT: add 5, 3, 4207; AIX32-NEXT: stw 31, 60(1) # 4-byte Folded Spill208; AIX32-NEXT: lwz 31, 0(1)209; AIX32-NEXT: stw 3, 24(31)210; AIX32-NEXT: mr 3, 5211; AIX32-NEXT: stw 4, 28(31)212; AIX32-NEXT: bl .leaf2[PR]213; AIX32-NEXT: nop214; AIX32-NEXT: lwz 3, 24(31)215; AIX32-NEXT: lwz 4, 28(31)216; AIX32-NEXT: sub 3, 3, 4217; AIX32-NEXT: bl .leaf2[PR]218; AIX32-NEXT: nop219; AIX32-NEXT: lwz 31, 60(1) # 4-byte Folded Reload220; AIX32-NEXT: addi 1, 1, 64221; AIX32-NEXT: lwz 0, 8(1)222; AIX32-NEXT: mtlr 0223; AIX32-NEXT: blr224;225; LE64-LABEL: nonleaf2_noredzone:226; LE64: # %bb.0: # %entry227; LE64-NEXT: mflr 0228; LE64-NEXT: std 30, -16(1) # 8-byte Folded Spill229; LE64-NEXT: stdu 1, -48(1)230; LE64-NEXT: std 0, 64(1)231; LE64-NEXT: ld 30, 0(1)232; LE64-NEXT: stw 3, 48(30)233; LE64-NEXT: add 3, 3, 4234; LE64-NEXT: stw 4, 52(30)235; LE64-NEXT: extsw 3, 3236; LE64-NEXT: bl leaf2237; LE64-NEXT: nop238; LE64-NEXT: lwz 3, 48(30)239; LE64-NEXT: lwz 4, 52(30)240; LE64-NEXT: sub 3, 3, 4241; LE64-NEXT: extsw 3, 3242; LE64-NEXT: bl leaf2243; LE64-NEXT: nop244; LE64-NEXT: addi 1, 1, 48245; LE64-NEXT: ld 0, 16(1)246; LE64-NEXT: ld 30, -16(1) # 8-byte Folded Reload247; LE64-NEXT: mtlr 0248; LE64-NEXT: blr249entry:250 %f.addr = call ptr @llvm.frameaddress(i32 1)251 %a.addr = getelementptr ptr, ptr %f.addr, i32 6252 %b.addr = getelementptr i32, ptr %a.addr, i32 1253 store i32 %a, ptr %a.addr, align 4254 store i32 %b, ptr %b.addr, align 4255 %0 = load i32, ptr %a.addr, align 4256 %1 = load i32, ptr %b.addr, align 4257 %add = add nsw i32 %0, %1258 call void @leaf2(i32 signext %add)259 %2 = load i32, ptr %a.addr, align 4260 %3 = load i32, ptr %b.addr, align 4261 %sub = sub nsw i32 %2, %3262 call void @leaf2(i32 signext %sub)263 ret void264}265 266define signext i32 @leaf1_redzone(i32 signext %a, i32 signext %b) #1 {267; AIX64-LABEL: leaf1_redzone:268; AIX64: # %bb.0: # %entry269; AIX64-NEXT: stw 3, -4(1)270; AIX64-NEXT: add 3, 3, 4271; AIX64-NEXT: extsw 3, 3272; AIX64-NEXT: stw 4, -8(1)273; AIX64-NEXT: blr274;275; AIX32-LABEL: leaf1_redzone:276; AIX32: # %bb.0: # %entry277; AIX32-NEXT: stw 3, -4(1)278; AIX32-NEXT: add 3, 3, 4279; AIX32-NEXT: stw 4, -8(1)280; AIX32-NEXT: blr281;282; LE64-LABEL: leaf1_redzone:283; LE64: # %bb.0: # %entry284; LE64-NEXT: stw 3, -4(1)285; LE64-NEXT: add 3, 3, 4286; LE64-NEXT: stw 4, -8(1)287; LE64-NEXT: extsw 3, 3288; LE64-NEXT: blr289entry:290 %a.addr = alloca i32, align 4291 %b.addr = alloca i32, align 4292 store i32 %a, ptr %a.addr, align 4293 store i32 %b, ptr %b.addr, align 4294 %0 = load i32, ptr %a.addr, align 4295 %1 = load i32, ptr %b.addr, align 4296 %add = add nsw i32 %0, %1297 ret i32 %add298}299 300define void @nonleaf1_redzone(i32 signext %a, i32 signext %b) #1 {301; AIX64-LABEL: nonleaf1_redzone:302; AIX64: # %bb.0: # %entry303; AIX64-NEXT: mflr 0304; AIX64-NEXT: stdu 1, -128(1)305; AIX64-NEXT: std 0, 144(1)306; AIX64-NEXT: stw 3, 124(1)307; AIX64-NEXT: add 3, 3, 4308; AIX64-NEXT: extsw 3, 3309; AIX64-NEXT: stw 4, 120(1)310; AIX64-NEXT: bl .leaf2[PR]311; AIX64-NEXT: nop312; AIX64-NEXT: lwz 3, 124(1)313; AIX64-NEXT: lwz 4, 120(1)314; AIX64-NEXT: sub 3, 3, 4315; AIX64-NEXT: extsw 3, 3316; AIX64-NEXT: bl .leaf2[PR]317; AIX64-NEXT: nop318; AIX64-NEXT: addi 1, 1, 128319; AIX64-NEXT: ld 0, 16(1)320; AIX64-NEXT: mtlr 0321; AIX64-NEXT: blr322;323; AIX32-LABEL: nonleaf1_redzone:324; AIX32: # %bb.0: # %entry325; AIX32-NEXT: mflr 0326; AIX32-NEXT: stwu 1, -64(1)327; AIX32-NEXT: stw 0, 72(1)328; AIX32-NEXT: stw 3, 60(1)329; AIX32-NEXT: add 3, 3, 4330; AIX32-NEXT: stw 4, 56(1)331; AIX32-NEXT: bl .leaf2[PR]332; AIX32-NEXT: nop333; AIX32-NEXT: lwz 3, 60(1)334; AIX32-NEXT: lwz 4, 56(1)335; AIX32-NEXT: sub 3, 3, 4336; AIX32-NEXT: bl .leaf2[PR]337; AIX32-NEXT: nop338; AIX32-NEXT: addi 1, 1, 64339; AIX32-NEXT: lwz 0, 8(1)340; AIX32-NEXT: mtlr 0341; AIX32-NEXT: blr342;343; LE64-LABEL: nonleaf1_redzone:344; LE64: # %bb.0: # %entry345; LE64-NEXT: mflr 0346; LE64-NEXT: stdu 1, -48(1)347; LE64-NEXT: std 0, 64(1)348; LE64-NEXT: stw 3, 44(1)349; LE64-NEXT: add 3, 3, 4350; LE64-NEXT: extsw 3, 3351; LE64-NEXT: stw 4, 40(1)352; LE64-NEXT: bl leaf2353; LE64-NEXT: nop354; LE64-NEXT: lwz 3, 44(1)355; LE64-NEXT: lwz 4, 40(1)356; LE64-NEXT: sub 3, 3, 4357; LE64-NEXT: extsw 3, 3358; LE64-NEXT: bl leaf2359; LE64-NEXT: nop360; LE64-NEXT: addi 1, 1, 48361; LE64-NEXT: ld 0, 16(1)362; LE64-NEXT: mtlr 0363; LE64-NEXT: blr364entry:365 %a.addr = alloca i32, align 4366 %b.addr = alloca i32, align 4367 store i32 %a, ptr %a.addr, align 4368 store i32 %b, ptr %b.addr, align 4369 %0 = load i32, ptr %a.addr, align 4370 %1 = load i32, ptr %b.addr, align 4371 %add = add nsw i32 %0, %1372 call void @leaf2(i32 signext %add)373 %2 = load i32, ptr %a.addr, align 4374 %3 = load i32, ptr %b.addr, align 4375 %sub = sub nsw i32 %2, %3376 call void @leaf2(i32 signext %sub)377 ret void378}379 380define signext i32 @leaf3_redzone(i32 signext %a, i32 signext %b) #1 {381; AIX64-LABEL: leaf3_redzone:382; AIX64: # %bb.0: # %entry383; AIX64-NEXT: stdu 1, -48(1)384; AIX64-NEXT: ld 6, 0(1)385; AIX64-NEXT: mr 5, 3386; AIX64-NEXT: add 3, 5, 4387; AIX64-NEXT: extsw 3, 3388; AIX64-NEXT: stw 5, 48(6)389; AIX64-NEXT: stw 4, 52(6)390; AIX64-NEXT: addi 1, 1, 48391; AIX64-NEXT: blr392;393; AIX32-LABEL: leaf3_redzone:394; AIX32: # %bb.0: # %entry395; AIX32-NEXT: stwu 1, -32(1)396; AIX32-NEXT: lwz 6, 0(1)397; AIX32-NEXT: mr 5, 3398; AIX32-NEXT: add 3, 3, 4399; AIX32-NEXT: stw 5, 24(6)400; AIX32-NEXT: stw 4, 28(6)401; AIX32-NEXT: addi 1, 1, 32402; AIX32-NEXT: blr403;404; LE64-LABEL: leaf3_redzone:405; LE64: # %bb.0: # %entry406; LE64-NEXT: stdu 1, -32(1)407; LE64-NEXT: ld 5, 0(1)408; LE64-NEXT: stw 3, 48(5)409; LE64-NEXT: add 3, 3, 4410; LE64-NEXT: stw 4, 52(5)411; LE64-NEXT: extsw 3, 3412; LE64-NEXT: addi 1, 1, 32413; LE64-NEXT: blr414entry:415 %f.addr = call ptr @llvm.frameaddress(i32 1)416 %a.addr = getelementptr ptr, ptr %f.addr, i32 6417 %b.addr = getelementptr i32, ptr %a.addr, i32 1418 store i32 %a, ptr %a.addr, align 4419 store i32 %b, ptr %b.addr, align 4420 %0 = load i32, ptr %a.addr, align 4421 %1 = load i32, ptr %b.addr, align 4422 %add = add nsw i32 %0, %1423 ret i32 %add424}425 426define void @nonleaf2_redzone(i32 signext %a, i32 signext %b) #1 {427; AIX64-LABEL: nonleaf2_redzone:428; AIX64: # %bb.0: # %entry429; AIX64-NEXT: mflr 0430; AIX64-NEXT: stdu 1, -128(1)431; AIX64-NEXT: std 0, 144(1)432; AIX64-NEXT: std 31, 120(1) # 8-byte Folded Spill433; AIX64-NEXT: add 5, 3, 4434; AIX64-NEXT: ld 31, 0(1)435; AIX64-NEXT: extsw 5, 5436; AIX64-NEXT: stw 3, 48(31)437; AIX64-NEXT: mr 3, 5438; AIX64-NEXT: stw 4, 52(31)439; AIX64-NEXT: bl .leaf2[PR]440; AIX64-NEXT: nop441; AIX64-NEXT: lwz 3, 48(31)442; AIX64-NEXT: lwz 4, 52(31)443; AIX64-NEXT: sub 3, 3, 4444; AIX64-NEXT: extsw 3, 3445; AIX64-NEXT: bl .leaf2[PR]446; AIX64-NEXT: nop447; AIX64-NEXT: ld 31, 120(1) # 8-byte Folded Reload448; AIX64-NEXT: addi 1, 1, 128449; AIX64-NEXT: ld 0, 16(1)450; AIX64-NEXT: mtlr 0451; AIX64-NEXT: blr452;453; AIX32-LABEL: nonleaf2_redzone:454; AIX32: # %bb.0: # %entry455; AIX32-NEXT: mflr 0456; AIX32-NEXT: stwu 1, -64(1)457; AIX32-NEXT: stw 0, 72(1)458; AIX32-NEXT: add 5, 3, 4459; AIX32-NEXT: stw 31, 60(1) # 4-byte Folded Spill460; AIX32-NEXT: lwz 31, 0(1)461; AIX32-NEXT: stw 3, 24(31)462; AIX32-NEXT: mr 3, 5463; AIX32-NEXT: stw 4, 28(31)464; AIX32-NEXT: bl .leaf2[PR]465; AIX32-NEXT: nop466; AIX32-NEXT: lwz 3, 24(31)467; AIX32-NEXT: lwz 4, 28(31)468; AIX32-NEXT: sub 3, 3, 4469; AIX32-NEXT: bl .leaf2[PR]470; AIX32-NEXT: nop471; AIX32-NEXT: lwz 31, 60(1) # 4-byte Folded Reload472; AIX32-NEXT: addi 1, 1, 64473; AIX32-NEXT: lwz 0, 8(1)474; AIX32-NEXT: mtlr 0475; AIX32-NEXT: blr476;477; LE64-LABEL: nonleaf2_redzone:478; LE64: # %bb.0: # %entry479; LE64-NEXT: mflr 0480; LE64-NEXT: std 30, -16(1) # 8-byte Folded Spill481; LE64-NEXT: stdu 1, -48(1)482; LE64-NEXT: std 0, 64(1)483; LE64-NEXT: ld 30, 0(1)484; LE64-NEXT: stw 3, 48(30)485; LE64-NEXT: add 3, 3, 4486; LE64-NEXT: stw 4, 52(30)487; LE64-NEXT: extsw 3, 3488; LE64-NEXT: bl leaf2489; LE64-NEXT: nop490; LE64-NEXT: lwz 3, 48(30)491; LE64-NEXT: lwz 4, 52(30)492; LE64-NEXT: sub 3, 3, 4493; LE64-NEXT: extsw 3, 3494; LE64-NEXT: bl leaf2495; LE64-NEXT: nop496; LE64-NEXT: addi 1, 1, 48497; LE64-NEXT: ld 0, 16(1)498; LE64-NEXT: ld 30, -16(1) # 8-byte Folded Reload499; LE64-NEXT: mtlr 0500; LE64-NEXT: blr501entry:502 %f.addr = call ptr @llvm.frameaddress(i32 1)503 %a.addr = getelementptr ptr, ptr %f.addr, i32 6504 %b.addr = getelementptr i32, ptr %a.addr, i32 1505 store i32 %a, ptr %a.addr, align 4506 store i32 %b, ptr %b.addr, align 4507 %0 = load i32, ptr %a.addr, align 4508 %1 = load i32, ptr %b.addr, align 4509 %add = add nsw i32 %0, %1510 call void @leaf2(i32 signext %add)511 %2 = load i32, ptr %a.addr, align 4512 %3 = load i32, ptr %b.addr, align 4513 %sub = sub nsw i32 %2, %3514 call void @leaf2(i32 signext %sub)515 ret void516}517 518attributes #0 = { noredzone nounwind noinline }519attributes #1 = { nounwind noinline }520