219 lines · plain
1; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s2; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -frame-pointer=all < %s | FileCheck -check-prefix=CHECK-FP %s3; RUN: llc -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all < %s | FileCheck -check-prefix=CHECK-32 %s4; RUN: llc -mtriple=powerpc-unknown-linux-gnu -frame-pointer=all -relocation-model=pic < %s | FileCheck -check-prefix=CHECK-32-PIC %s5target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"6target triple = "powerpc64-unknown-linux-gnu"7 8%struct.s = type { i32, i32 }9 10declare void @bar(ptr)11 12@barbaz = external global i3213 14define void @goo(ptr byval(%struct.s) nocapture readonly %a) {15entry:16 %x = alloca [2 x i32], align 3217 %0 = load i32, ptr %a, align 418 store i32 %0, ptr %x, align 3219 %b = getelementptr inbounds %struct.s, ptr %a, i64 0, i32 120 %1 = load i32, ptr %b, align 421 %2 = load i32, ptr @barbaz, align 422 %arrayidx2 = getelementptr inbounds [2 x i32], ptr %x, i64 0, i64 123 store i32 %2, ptr %arrayidx2, align 424 call void @bar(ptr %x)25 ret void26}27 28; CHECK-LABEL: @goo29 30; CHECK-DAG: mflr {{[0-9]+}}31; CHECK-DAG: clrldi [[REG:[0-9]+]], 1, 5932; CHECK-DAG: std 30, -16(1)33; CHECK-DAG: mr 30, 134; CHECK-DAG: std 0, 16(1)35; CHECK-DAG: subfic 0, [[REG]], -16036; CHECK: stdux 1, 1, 037 38; CHECK: .cfi_def_cfa_register r3039; CHECK: .cfi_offset r30, -1640; CHECK: .cfi_offset lr, 1641 42; CHECK: std 3, 48(30)43 44; CHECK: mr 1, 3045; CHECK-DAG: ld [[SR:[0-9]+]], 16(1)46; CHECK-DAG: ld 30, -16(1)47; CHECK-DAG: mtlr [[SR]]48; CHECK: blr49 50; CHECK-FP-LABEL: @goo51 52; CHECK-FP-DAG: mflr {{[0-9]+}}53; CHECK-FP-DAG: clrldi [[REG:[0-9]+]], 1, 5954; CHECK-FP-DAG: std 31, -8(1)55; CHECK-FP-DAG: std 30, -16(1)56; CHECK-FP-DAG: mr 30, 157; CHECK-FP-DAG: std 0, 16(1)58; CHECK-FP-DAG: subfic 0, [[REG]], -16059; CHECK-FP: stdux 1, 1, 060 61; CHECK-FP: .cfi_def_cfa_register r3062; CHECK-FP: .cfi_offset r31, -863; CHECK-FP: .cfi_offset r30, -1664; CHECK-FP: .cfi_offset lr, 1665 66; CHECK-FP: mr 31, 167 68; CHECK-FP: std 3, 48(30)69 70; CHECK-FP: mr 1, 3071; CHECK-FP-DAG: ld [[SR:[0-9]+]], 16(1)72; CHECK-FP-DAG: ld 31, -8(1)73; CHECK-FP-DAG: ld 30, -16(1)74; CHECK-FP-DAG: mtlr [[SR]]75; CHECK-FP: blr76 77; CHECK-32-LABEL: @goo78; CHECK-32-DAG: mflr [[LR:[0-9]+]]79; CHECK-32-DAG: clrlwi [[REG:[0-9]+]], 1, 2780; CHECK-32-DAG: stw [[LR]], 4(1)81; CHECK-32-DAG: subfic 0, [[REG]], -6482; CHECK-32: stwux 1, 1, 083; CHECK-32: sub 0, 1, 084; CHECK-32: addic 0, 0, -485; CHECK-32: stwx 31, 0, 086; CHECK-32: addic 0, 0, -487; CHECK-32: stwx 30, 0, 088; CHECK-32: addic 30, 0, 889 90; CHECK-32-PIC-LABEL: @goo91; CHECK-32-PIC-DAG: mflr [[LR:[0-9]+]]92; CHECK-32-PIC-DAG: clrlwi [[REG:[0-9]+]], 1, 2793; CHECK-32-PIC-DAG: stw [[LR]], 4(1)94; CHECK-32-PIC-DAG: subfic 0, [[REG]], -6495; CHECK-32-PIC: stwux 1, 1, 096; CHECK-32-PIC: sub 0, 1, 097; CHECK-32-PIC: addic 0, 0, -498; CHECK-32-PIC: stwx 31, 0, 099; CHECK-32-PIC: addic 0, 0, -4100; CHECK-32-PIC: stwx 30, 0, 0101; CHECK-32-PIC: addic 0, 0, -4102; CHECK-32-PIC: stwx 29, 0, 0103; CHECK-32-PIC: addic 29, 0, 12104 105; The large-frame-size case.106define void @hoo(ptr byval(%struct.s) nocapture readonly %a) {107entry:108 %x = alloca [200000 x i32], align 32109 %0 = load i32, ptr %a, align 4110 store i32 %0, ptr %x, align 32111 %b = getelementptr inbounds %struct.s, ptr %a, i64 0, i32 1112 %1 = load i32, ptr %b, align 4113 %arrayidx2 = getelementptr inbounds [200000 x i32], ptr %x, i64 0, i64 1114 store i32 %1, ptr %arrayidx2, align 4115 call void @bar(ptr %x)116 ret void117}118 119; CHECK-LABEL: @hoo120 121; CHECK-DAG: lis [[REG1:[0-9]+]], -13122; CHECK-DAG: clrldi [[REG3:[0-9]+]], 1, 59123; CHECK-DAG: mflr {{[0-9]+}}124; CHECK-DAG: ori [[REG2:[0-9]+]], [[REG1]], 51808125; CHECK-DAG: std 30, -16(1)126; CHECK-DAG: mr 30, 1127; CHECK-DAG: std 0, 16(1)128; CHECK-DAG: subc 0, [[REG2]], [[REG3]]129; CHECK: stdux 1, 1, 0130 131; CHECK: .cfi_def_cfa_register r30132 133; CHECK: blr134 135; CHECK-32-LABEL: @hoo136 137; CHECK-32-DAG: lis [[REG1:[0-9]+]], -13138; CHECK-32-DAG: clrlwi [[REG3:[0-9]+]], 1, 27139; CHECK-32-DAG: mflr [[LR:[0-9]+]]140; CHECK-32-DAG: ori [[REG2:[0-9]+]], [[REG1]], 51904141; CHECK-32-DAG: stw [[LR]], 4(1)142; CHECK-32-DAG: subc 0, [[REG2]], [[REG3]]143; CHECK-32: stwux 1, 1, 0144; CHECK-32: sub 0, 1, 0145; CHECK-32: addic 0, 0, -4146; CHECK-32: stwx 31, 0, 0147; CHECK-32: addic 0, 0, -4148; CHECK-32: stwx 30, 0, 0149; CHECK-32: addic 30, 0, 8150 151; CHECK-32: blr152 153; CHECK-32-PIC-LABEL: @hoo154 155; CHECK-32-PIC-DAG: lis [[REG1:[0-9]+]], -13156; CHECK-32-PIC-DAG: clrlwi [[REG3:[0-9]+]], 1, 27157; CHECK-32-PIC-DAG: mflr {{[0-9]+}}158; CHECK-32-PIC-DAG: ori [[REG2:[0-9]+]], [[REG1]], 51904159; CHECK-32-PIC-DAG: stw 0, 4(1)160; CHECK-32-PIC-DAG: subc 0, [[REG2]], [[REG3]]161; CHECK-32-PIC: stwux 1, 1, 0162; CHECK-32-PIC: sub 0, 1, 0163; CHECK-32-PIC: addic 0, 0, -4164; CHECK-32-PIC: stwx 31, 0, 0165; CHECK-32-PIC: addic 0, 0, -8166; CHECK-32-PIC: stwx 29, 0, 0167; CHECK-32-PIC: addic 29, 0, 12168 169; CHECK-32: blr170 171; Make sure that the FP save area is still allocated correctly relative to172; where r30 is saved.173define void @loo(ptr byval(%struct.s) nocapture readonly %a) {174entry:175 %x = alloca [2 x i32], align 32176 %0 = load i32, ptr %a, align 4177 store i32 %0, ptr %x, align 32178 %b = getelementptr inbounds %struct.s, ptr %a, i64 0, i32 1179 %1 = load i32, ptr %b, align 4180 %arrayidx2 = getelementptr inbounds [2 x i32], ptr %x, i64 0, i64 1181 store i32 %1, ptr %arrayidx2, align 4182 call void @bar(ptr %x)183 call void asm sideeffect "", "~{f30}"() nounwind184 ret void185}186 187; CHECK-LABEL: @loo188 189; CHECK-DAG: mflr {{[0-9]+}}190; CHECK-DAG: clrldi [[REG:[0-9]+]], 1, 59191; CHECK-DAG: std 30, -32(1)192; CHECK-DAG: mr 30, 1193; CHECK-DAG: std 0, 16(1)194; CHECK-DAG: subfic 0, [[REG]], -192195; CHECK: stdux 1, 1, 0196 197; CHECK: .cfi_def_cfa_register r30198 199; CHECK: stfd 30, -16(30)200 201; CHECK: blr202 203; CHECK-FP-LABEL: @loo204 205; CHECK-FP-DAG: mflr {{[0-9]+}}206; CHECK-FP-DAG: clrldi [[REG:[0-9]+]], 1, 59207; CHECK-FP-DAG: std 31, -24(1)208; CHECK-FP-DAG: std 30, -32(1)209; CHECK-FP-DAG: mr 30, 1210; CHECK-FP-DAG: std 0, 16(1)211; CHECK-FP-DAG: subfic 0, [[REG]], -192212; CHECK-FP: stdux 1, 1, 0213 214; CHECK-FP: .cfi_def_cfa_register r30215 216; CHECK-FP: stfd 30, -16(30)217 218; CHECK-FP: blr219