| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | |
| ; RUN: llc -mtriple=powerpc-ibm-aix-xcoff -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=AIX32 | |
| ; RUN: llc -mtriple=powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=AIX64 | |
| ; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s --check-prefix=LE | |
| define ptr @main() #0 { | |
| ; AIX32-LABEL: main: | |
| ; AIX32: # %bb.0: # %entry | |
| ; AIX32-NEXT: stwu 1, -32(1) | |
| ; AIX32-NEXT: mr 3, 1 | |
| ; AIX32-NEXT: addi 1, 1, 32 | |
| ; AIX32-NEXT: blr | |
| ; | |
| ; AIX64-LABEL: main: | |
| ; AIX64: # %bb.0: # %entry | |
| ; AIX64-NEXT: stdu 1, -48(1) | |
| ; AIX64-NEXT: mr 3, 1 | |
| ; AIX64-NEXT: addi 1, 1, 48 | |
| ; AIX64-NEXT: blr | |
| ; | |
| ; LE-LABEL: main: | |
| ; LE: # %bb.0: # %entry | |
| ; LE-NEXT: stdu 1, -32(1) | |
| ; LE-NEXT: mr 3, 1 | |
| ; LE-NEXT: addi 1, 1, 32 | |
| ; LE-NEXT: blr | |
| entry: | |
| %0 = call ptr @llvm.frameaddress(i32 0) | |
| ret ptr %0 | |
| } | |
| define ptr @foo_naked() #3 { ; naked | |
| ; AIX32-LABEL: foo_naked: | |
| ; AIX32: # %bb.0: # %entry | |
| ; AIX32-NEXT: lwz 3, 0(1) | |
| ; AIX32-NEXT: blr | |
| ; | |
| ; AIX64-LABEL: foo_naked: | |
| ; AIX64: # %bb.0: # %entry | |
| ; AIX64-NEXT: ld 3, 0(1) | |
| ; AIX64-NEXT: blr | |
| ; | |
| ; LE-LABEL: foo_naked: | |
| ; LE: # %bb.0: # %entry | |
| ; LE-NEXT: ld 3, 0(1) | |
| ; LE-NEXT: blr | |
| entry: | |
| %0 = call ptr @llvm.frameaddress(i32 1) | |
| ret ptr %0 | |
| } | |
| define ptr @foo1() #0 { | |
| ; AIX32-LABEL: foo1: | |
| ; AIX32: # %bb.0: # %entry | |
| ; AIX32-NEXT: stwu 1, -32(1) | |
| ; AIX32-NEXT: lwz 3, 0(1) | |
| ; AIX32-NEXT: addi 1, 1, 32 | |
| ; AIX32-NEXT: blr | |
| ; | |
| ; AIX64-LABEL: foo1: | |
| ; AIX64: # %bb.0: # %entry | |
| ; AIX64-NEXT: stdu 1, -48(1) | |
| ; AIX64-NEXT: ld 3, 0(1) | |
| ; AIX64-NEXT: addi 1, 1, 48 | |
| ; AIX64-NEXT: blr | |
| ; | |
| ; LE-LABEL: foo1: | |
| ; LE: # %bb.0: # %entry | |
| ; LE-NEXT: stdu 1, -32(1) | |
| ; LE-NEXT: ld 3, 0(1) | |
| ; LE-NEXT: addi 1, 1, 32 | |
| ; LE-NEXT: blr | |
| entry: | |
| %0 = call ptr @llvm.frameaddress(i32 1) | |
| ret ptr %0 | |
| } | |
| define ptr @foo2() #0 { | |
| ; AIX32-LABEL: foo2: | |
| ; AIX32: # %bb.0: # %entry | |
| ; AIX32-NEXT: stwu 1, -32(1) | |
| ; AIX32-NEXT: lwz 3, 0(1) | |
| ; AIX32-NEXT: lwz 3, 0(3) | |
| ; AIX32-NEXT: addi 1, 1, 32 | |
| ; AIX32-NEXT: blr | |
| ; | |
| ; AIX64-LABEL: foo2: | |
| ; AIX64: # %bb.0: # %entry | |
| ; AIX64-NEXT: stdu 1, -48(1) | |
| ; AIX64-NEXT: ld 3, 0(1) | |
| ; AIX64-NEXT: ld 3, 0(3) | |
| ; AIX64-NEXT: addi 1, 1, 48 | |
| ; AIX64-NEXT: blr | |
| ; | |
| ; LE-LABEL: foo2: | |
| ; LE: # %bb.0: # %entry | |
| ; LE-NEXT: stdu 1, -32(1) | |
| ; LE-NEXT: ld 3, 0(1) | |
| ; LE-NEXT: ld 3, 0(3) | |
| ; LE-NEXT: addi 1, 1, 32 | |
| ; LE-NEXT: blr | |
| entry: | |
| %0 = call ptr @llvm.frameaddress(i32 2) | |
| ret ptr %0 | |
| } | |
| define ptr @bar0() #0 { | |
| ; AIX32-LABEL: bar0: | |
| ; AIX32: # %bb.0: # %entry | |
| ; AIX32-NEXT: mflr 0 | |
| ; AIX32-NEXT: stw 31, -4(1) | |
| ; AIX32-NEXT: stw 0, 8(1) | |
| ; AIX32-NEXT: lis 0, -2 | |
| ; AIX32-NEXT: ori 0, 0, 31008 | |
| ; AIX32-NEXT: stwux 1, 1, 0 | |
| ; AIX32-NEXT: mr 31, 1 | |
| ; AIX32-NEXT: addi 3, 31, 60 | |
| ; AIX32-NEXT: bl .use[PR] | |
| ; AIX32-NEXT: nop | |
| ; AIX32-NEXT: mr 3, 31 | |
| ; AIX32-NEXT: lwz 1, 0(1) | |
| ; AIX32-NEXT: lwz 0, 8(1) | |
| ; AIX32-NEXT: lwz 31, -4(1) | |
| ; AIX32-NEXT: mtlr 0 | |
| ; AIX32-NEXT: blr | |
| ; | |
| ; AIX64-LABEL: bar0: | |
| ; AIX64: # %bb.0: # %entry | |
| ; AIX64-NEXT: mflr 0 | |
| ; AIX64-NEXT: std 31, -8(1) | |
| ; AIX64-NEXT: std 0, 16(1) | |
| ; AIX64-NEXT: lis 0, -2 | |
| ; AIX64-NEXT: ori 0, 0, 30944 | |
| ; AIX64-NEXT: stdux 1, 1, 0 | |
| ; AIX64-NEXT: mr 31, 1 | |
| ; AIX64-NEXT: addi 3, 31, 120 | |
| ; AIX64-NEXT: bl .use[PR] | |
| ; AIX64-NEXT: nop | |
| ; AIX64-NEXT: mr 3, 31 | |
| ; AIX64-NEXT: ld 1, 0(1) | |
| ; AIX64-NEXT: ld 0, 16(1) | |
| ; AIX64-NEXT: ld 31, -8(1) | |
| ; AIX64-NEXT: mtlr 0 | |
| ; AIX64-NEXT: blr | |
| ; | |
| ; LE-LABEL: bar0: | |
| ; LE: # %bb.0: # %entry | |
| ; LE-NEXT: mflr 0 | |
| ; LE-NEXT: std 31, -8(1) | |
| ; LE-NEXT: std 0, 16(1) | |
| ; LE-NEXT: lis 0, -2 | |
| ; LE-NEXT: ori 0, 0, 31024 | |
| ; LE-NEXT: stdux 1, 1, 0 | |
| ; LE-NEXT: mr 31, 1 | |
| ; LE-NEXT: addi 3, 31, 40 | |
| ; LE-NEXT: bl use | |
| ; LE-NEXT: nop | |
| ; LE-NEXT: mr 3, 31 | |
| ; LE-NEXT: ld 1, 0(1) | |
| ; LE-NEXT: ld 0, 16(1) | |
| ; LE-NEXT: ld 31, -8(1) | |
| ; LE-NEXT: mtlr 0 | |
| ; LE-NEXT: blr | |
| entry: | |
| %x = alloca [100000 x i8] ; <ptr> [#uses=1] | |
| call void @use(ptr %x) nounwind | |
| %0 = call ptr @llvm.frameaddress(i32 0) | |
| ret ptr %0 | |
| } | |
| define ptr @bar1() #0 { | |
| ; AIX32-LABEL: bar1: | |
| ; AIX32: # %bb.0: # %entry | |
| ; AIX32-NEXT: mflr 0 | |
| ; AIX32-NEXT: stw 31, -4(1) | |
| ; AIX32-NEXT: stw 0, 8(1) | |
| ; AIX32-NEXT: lis 0, -2 | |
| ; AIX32-NEXT: ori 0, 0, 31008 | |
| ; AIX32-NEXT: stwux 1, 1, 0 | |
| ; AIX32-NEXT: mr 31, 1 | |
| ; AIX32-NEXT: addi 3, 31, 60 | |
| ; AIX32-NEXT: bl .use[PR] | |
| ; AIX32-NEXT: nop | |
| ; AIX32-NEXT: lwz 3, 0(31) | |
| ; AIX32-NEXT: lwz 1, 0(1) | |
| ; AIX32-NEXT: lwz 0, 8(1) | |
| ; AIX32-NEXT: lwz 31, -4(1) | |
| ; AIX32-NEXT: mtlr 0 | |
| ; AIX32-NEXT: blr | |
| ; | |
| ; AIX64-LABEL: bar1: | |
| ; AIX64: # %bb.0: # %entry | |
| ; AIX64-NEXT: mflr 0 | |
| ; AIX64-NEXT: std 31, -8(1) | |
| ; AIX64-NEXT: std 0, 16(1) | |
| ; AIX64-NEXT: lis 0, -2 | |
| ; AIX64-NEXT: ori 0, 0, 30944 | |
| ; AIX64-NEXT: stdux 1, 1, 0 | |
| ; AIX64-NEXT: mr 31, 1 | |
| ; AIX64-NEXT: addi 3, 31, 120 | |
| ; AIX64-NEXT: bl .use[PR] | |
| ; AIX64-NEXT: nop | |
| ; AIX64-NEXT: ld 3, 0(31) | |
| ; AIX64-NEXT: ld 1, 0(1) | |
| ; AIX64-NEXT: ld 0, 16(1) | |
| ; AIX64-NEXT: ld 31, -8(1) | |
| ; AIX64-NEXT: mtlr 0 | |
| ; AIX64-NEXT: blr | |
| ; | |
| ; LE-LABEL: bar1: | |
| ; LE: # %bb.0: # %entry | |
| ; LE-NEXT: mflr 0 | |
| ; LE-NEXT: std 31, -8(1) | |
| ; LE-NEXT: std 0, 16(1) | |
| ; LE-NEXT: lis 0, -2 | |
| ; LE-NEXT: ori 0, 0, 31024 | |
| ; LE-NEXT: stdux 1, 1, 0 | |
| ; LE-NEXT: mr 31, 1 | |
| ; LE-NEXT: addi 3, 31, 40 | |
| ; LE-NEXT: bl use | |
| ; LE-NEXT: nop | |
| ; LE-NEXT: ld 3, 0(31) | |
| ; LE-NEXT: ld 1, 0(1) | |
| ; LE-NEXT: ld 0, 16(1) | |
| ; LE-NEXT: ld 31, -8(1) | |
| ; LE-NEXT: mtlr 0 | |
| ; LE-NEXT: blr | |
| entry: | |
| %x = alloca [100000 x i8] ; <ptr> [#uses=1] | |
| call void @use(ptr %x) nounwind | |
| %0 = call ptr @llvm.frameaddress(i32 1) | |
| ret ptr %0 | |
| } | |
| declare void @use(ptr) | |
| declare ptr @llvm.frameaddress(i32) #2 | |
| attributes #0 = { nounwind "less-precise-fpmad"="false" "frame-pointer"="non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "use-soft-float"="false" } | |
| attributes #1 = { noreturn nounwind } | |
| attributes #2 = { nounwind readnone } | |
| attributes #3 = { nounwind naked "less-precise-fpmad"="false" "frame-pointer"="non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "use-soft-float"="false" } |