; 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" "unsafe-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" "unsafe-fp-math"="false" "use-soft-float"="false" }