1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=powerpc-ibm-aix-xcoff -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=AIX32 3; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=AIX64 4; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=LE 5 6define ptr @main() #0 { 7; AIX32-LABEL: main: 8; AIX32: # %bb.0: # %entry 9; AIX32-NEXT: stwu 1, -32(1) 10; AIX32-NEXT: mr 3, 1 11; AIX32-NEXT: addi 1, 1, 32 12; AIX32-NEXT: blr 13; 14; AIX64-LABEL: main: 15; AIX64: # %bb.0: # %entry 16; AIX64-NEXT: stdu 1, -48(1) 17; AIX64-NEXT: mr 3, 1 18; AIX64-NEXT: addi 1, 1, 48 19; AIX64-NEXT: blr 20; 21; LE-LABEL: main: 22; LE: # %bb.0: # %entry 23; LE-NEXT: stdu 1, -32(1) 24; LE-NEXT: mr 3, 1 25; LE-NEXT: addi 1, 1, 32 26; LE-NEXT: blr 27entry: 28 %0 = call ptr @llvm.frameaddress(i32 0) 29 ret ptr %0 30} 31 32define ptr @foo_naked() #3 { ; naked 33; AIX32-LABEL: foo_naked: 34; AIX32: # %bb.0: # %entry 35; AIX32-NEXT: lwz 3, 0(1) 36; AIX32-NEXT: blr 37; 38; AIX64-LABEL: foo_naked: 39; AIX64: # %bb.0: # %entry 40; AIX64-NEXT: ld 3, 0(1) 41; AIX64-NEXT: blr 42; 43; LE-LABEL: foo_naked: 44; LE: # %bb.0: # %entry 45; LE-NEXT: ld 3, 0(1) 46; LE-NEXT: blr 47entry: 48 %0 = call ptr @llvm.frameaddress(i32 1) 49 ret ptr %0 50} 51 52define ptr @foo1() #0 { 53; AIX32-LABEL: foo1: 54; AIX32: # %bb.0: # %entry 55; AIX32-NEXT: stwu 1, -32(1) 56; AIX32-NEXT: lwz 3, 0(1) 57; AIX32-NEXT: addi 1, 1, 32 58; AIX32-NEXT: blr 59; 60; AIX64-LABEL: foo1: 61; AIX64: # %bb.0: # %entry 62; AIX64-NEXT: stdu 1, -48(1) 63; AIX64-NEXT: ld 3, 0(1) 64; AIX64-NEXT: addi 1, 1, 48 65; AIX64-NEXT: blr 66; 67; LE-LABEL: foo1: 68; LE: # %bb.0: # %entry 69; LE-NEXT: stdu 1, -32(1) 70; LE-NEXT: ld 3, 0(1) 71; LE-NEXT: addi 1, 1, 32 72; LE-NEXT: blr 73entry: 74 %0 = call ptr @llvm.frameaddress(i32 1) 75 ret ptr %0 76} 77 78define ptr @foo2() #0 { 79; AIX32-LABEL: foo2: 80; AIX32: # %bb.0: # %entry 81; AIX32-NEXT: stwu 1, -32(1) 82; AIX32-NEXT: lwz 3, 0(1) 83; AIX32-NEXT: lwz 3, 0(3) 84; AIX32-NEXT: addi 1, 1, 32 85; AIX32-NEXT: blr 86; 87; AIX64-LABEL: foo2: 88; AIX64: # %bb.0: # %entry 89; AIX64-NEXT: stdu 1, -48(1) 90; AIX64-NEXT: ld 3, 0(1) 91; AIX64-NEXT: ld 3, 0(3) 92; AIX64-NEXT: addi 1, 1, 48 93; AIX64-NEXT: blr 94; 95; LE-LABEL: foo2: 96; LE: # %bb.0: # %entry 97; LE-NEXT: stdu 1, -32(1) 98; LE-NEXT: ld 3, 0(1) 99; LE-NEXT: ld 3, 0(3) 100; LE-NEXT: addi 1, 1, 32 101; LE-NEXT: blr 102entry: 103 %0 = call ptr @llvm.frameaddress(i32 2) 104 ret ptr %0 105} 106 107define ptr @bar0() #0 { 108; AIX32-LABEL: bar0: 109; AIX32: # %bb.0: # %entry 110; AIX32-NEXT: mflr 0 111; AIX32-NEXT: stw 31, -4(1) 112; AIX32-NEXT: stw 0, 8(1) 113; AIX32-NEXT: lis 0, -2 114; AIX32-NEXT: ori 0, 0, 31008 115; AIX32-NEXT: stwux 1, 1, 0 116; AIX32-NEXT: mr 31, 1 117; AIX32-NEXT: addi 3, 31, 60 118; AIX32-NEXT: bl .use[PR] 119; AIX32-NEXT: nop 120; AIX32-NEXT: mr 3, 31 121; AIX32-NEXT: lwz 1, 0(1) 122; AIX32-NEXT: lwz 0, 8(1) 123; AIX32-NEXT: lwz 31, -4(1) 124; AIX32-NEXT: mtlr 0 125; AIX32-NEXT: blr 126; 127; AIX64-LABEL: bar0: 128; AIX64: # %bb.0: # %entry 129; AIX64-NEXT: mflr 0 130; AIX64-NEXT: std 31, -8(1) 131; AIX64-NEXT: std 0, 16(1) 132; AIX64-NEXT: lis 0, -2 133; AIX64-NEXT: ori 0, 0, 30944 134; AIX64-NEXT: stdux 1, 1, 0 135; AIX64-NEXT: mr 31, 1 136; AIX64-NEXT: addi 3, 31, 120 137; AIX64-NEXT: bl .use[PR] 138; AIX64-NEXT: nop 139; AIX64-NEXT: mr 3, 31 140; AIX64-NEXT: ld 1, 0(1) 141; AIX64-NEXT: ld 0, 16(1) 142; AIX64-NEXT: ld 31, -8(1) 143; AIX64-NEXT: mtlr 0 144; AIX64-NEXT: blr 145; 146; LE-LABEL: bar0: 147; LE: # %bb.0: # %entry 148; LE-NEXT: mflr 0 149; LE-NEXT: std 31, -8(1) 150; LE-NEXT: std 0, 16(1) 151; LE-NEXT: lis 0, -2 152; LE-NEXT: ori 0, 0, 31024 153; LE-NEXT: stdux 1, 1, 0 154; LE-NEXT: mr 31, 1 155; LE-NEXT: addi 3, 31, 40 156; LE-NEXT: bl use 157; LE-NEXT: nop 158; LE-NEXT: mr 3, 31 159; LE-NEXT: ld 1, 0(1) 160; LE-NEXT: ld 0, 16(1) 161; LE-NEXT: ld 31, -8(1) 162; LE-NEXT: mtlr 0 163; LE-NEXT: blr 164entry: 165 %x = alloca [100000 x i8] ; <ptr> [#uses=1] 166 call void @use(ptr %x) nounwind 167 %0 = call ptr @llvm.frameaddress(i32 0) 168 ret ptr %0 169} 170 171define ptr @bar1() #0 { 172; AIX32-LABEL: bar1: 173; AIX32: # %bb.0: # %entry 174; AIX32-NEXT: mflr 0 175; AIX32-NEXT: stw 31, -4(1) 176; AIX32-NEXT: stw 0, 8(1) 177; AIX32-NEXT: lis 0, -2 178; AIX32-NEXT: ori 0, 0, 31008 179; AIX32-NEXT: stwux 1, 1, 0 180; AIX32-NEXT: mr 31, 1 181; AIX32-NEXT: addi 3, 31, 60 182; AIX32-NEXT: bl .use[PR] 183; AIX32-NEXT: nop 184; AIX32-NEXT: lwz 3, 0(31) 185; AIX32-NEXT: lwz 1, 0(1) 186; AIX32-NEXT: lwz 0, 8(1) 187; AIX32-NEXT: lwz 31, -4(1) 188; AIX32-NEXT: mtlr 0 189; AIX32-NEXT: blr 190; 191; AIX64-LABEL: bar1: 192; AIX64: # %bb.0: # %entry 193; AIX64-NEXT: mflr 0 194; AIX64-NEXT: std 31, -8(1) 195; AIX64-NEXT: std 0, 16(1) 196; AIX64-NEXT: lis 0, -2 197; AIX64-NEXT: ori 0, 0, 30944 198; AIX64-NEXT: stdux 1, 1, 0 199; AIX64-NEXT: mr 31, 1 200; AIX64-NEXT: addi 3, 31, 120 201; AIX64-NEXT: bl .use[PR] 202; AIX64-NEXT: nop 203; AIX64-NEXT: ld 3, 0(31) 204; AIX64-NEXT: ld 1, 0(1) 205; AIX64-NEXT: ld 0, 16(1) 206; AIX64-NEXT: ld 31, -8(1) 207; AIX64-NEXT: mtlr 0 208; AIX64-NEXT: blr 209; 210; LE-LABEL: bar1: 211; LE: # %bb.0: # %entry 212; LE-NEXT: mflr 0 213; LE-NEXT: std 31, -8(1) 214; LE-NEXT: std 0, 16(1) 215; LE-NEXT: lis 0, -2 216; LE-NEXT: ori 0, 0, 31024 217; LE-NEXT: stdux 1, 1, 0 218; LE-NEXT: mr 31, 1 219; LE-NEXT: addi 3, 31, 40 220; LE-NEXT: bl use 221; LE-NEXT: nop 222; LE-NEXT: ld 3, 0(31) 223; LE-NEXT: ld 1, 0(1) 224; LE-NEXT: ld 0, 16(1) 225; LE-NEXT: ld 31, -8(1) 226; LE-NEXT: mtlr 0 227; LE-NEXT: blr 228entry: 229 %x = alloca [100000 x i8] ; <ptr> [#uses=1] 230 call void @use(ptr %x) nounwind 231 %0 = call ptr @llvm.frameaddress(i32 1) 232 ret ptr %0 233} 234 235declare void @use(ptr) 236 237declare ptr @llvm.frameaddress(i32) #2 238 239attributes #0 = { nounwind "less-precise-fpmad"="false" "frame-pointer"="non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } 240attributes #1 = { noreturn nounwind } 241attributes #2 = { nounwind readnone } 242attributes #3 = { nounwind naked "less-precise-fpmad"="false" "frame-pointer"="non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } 243