llvm/test/CodeGen/PowerPC/ppc64-nest.ll
Hal Finkel d14325bee9 [PowerPC] Support the nest parameter attribute
This adds support for the 'nest' attribute, which allows the static chain
register to be set for functions calls under non-Darwin PPC/PPC64 targets. r11
is the chain register (which the PPC64 ELF ABI calls the "environment
pointer"). For indirect calls under PPC64 ELFv1, this would normally be loaded
from the function descriptor, but providing an explicit 'nest' parameter will
override that process and use the value provided.

This allows __builtin_call_with_static_chain to work as expected on PowerPC.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241984 91177308-0d34-0410-b5e6-96231b3b80d8
2015-07-12 00:37:44 +00:00

43 lines
977 B
LLVM

; RUN: llc < %s | FileCheck %s
target datalayout = "E-m:e-i64:64-n32:64"
target triple = "powerpc64-unknown-linux-gnu"
; Tests that the 'nest' parameter attribute causes the relevant parameter to be
; passed in the right register (r11 for PPC).
define i8* @nest_receiver(i8* nest %arg) nounwind {
; CHECK-LABEL: nest_receiver:
; CHECK: # BB#0:
; CHECK-NEXT: mr 3, 11
; CHECK-NEXT: blr
ret i8* %arg
}
define i8* @nest_caller(i8* %arg) nounwind {
; CHECK-LABEL: nest_caller:
; CHECK: mr 11, 3
; CHECK-NEXT: bl nest_receiver
; CHECK: blr
%result = call i8* @nest_receiver(i8* nest %arg)
ret i8* %result
}
define void @test_indirect(i32 ()* nocapture %f, i8* %p) {
entry:
; CHECK-LABEL: test_indirect
; CHECK-DAG: ld [[DEST:[0-9]+]], 0(3)
; CHECK-DAG: ld 2, 8(3)
; CHECK-DAG: mr 11, 4
; CHECK: mtctr [[DEST]]
; CHECK: bctrl
; CHECK: blr
%callee.knr.cast = bitcast i32 ()* %f to i32 (i8*)*
%call = tail call signext i32 %callee.knr.cast(i8* nest %p)
ret void
}