2017-08-02 06:20:41 +08:00
|
|
|
; RUN: llc -relocation-model=static -verify-machineinstrs < %s -mcpu=pwr7 | FileCheck %s
|
2017-08-22 01:35:32 +08:00
|
|
|
; RUN: llc -relocation-model=static -verify-machineinstrs < %s -code-model=small -mcpu=pwr7 | FileCheck %s -check-prefix=SCM
|
|
|
|
|
2012-09-19 00:47:58 +08:00
|
|
|
target 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-v128:128:128-n32:64"
|
|
|
|
target triple = "powerpc64-unknown-linux-gnu"
|
|
|
|
|
2016-04-07 23:30:55 +08:00
|
|
|
|
|
|
|
define void @foo() nounwind noinline {
|
2012-09-19 00:47:58 +08:00
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
2012-09-19 03:51:44 +08:00
|
|
|
define weak void @foo_weak() nounwind {
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
2012-09-19 00:47:58 +08:00
|
|
|
; Calls to local function does not require the TOC restore 'nop'
|
|
|
|
define void @test_direct() nounwind readnone {
|
2013-07-14 04:38:47 +08:00
|
|
|
; CHECK-LABEL: test_direct:
|
2012-09-19 00:47:58 +08:00
|
|
|
tail call void @foo() nounwind
|
2016-04-06 10:04:38 +08:00
|
|
|
; Because of tail call optimization, it can be 'b' instruction.
|
|
|
|
; CHECK: [[BR:b[l]?]] foo
|
2012-09-19 00:47:58 +08:00
|
|
|
; CHECK-NOT: nop
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
2017-08-22 01:35:32 +08:00
|
|
|
; Calls to weak function requires a TOC restore 'nop' with the small codemodel
|
|
|
|
; because the definition that gets choosen at link time may come from a
|
|
|
|
; different section even though we have seen a weak definition in the same
|
|
|
|
; section at compile time.
|
|
|
|
; With large and medium codemodels no TOC restore is needed, since we know
|
|
|
|
; whichever definition is choosen it resides within the same DSO boundaries and
|
|
|
|
; therefore shares the same TOC.
|
2012-09-19 03:51:44 +08:00
|
|
|
define void @test_weak() nounwind readnone {
|
|
|
|
tail call void @foo_weak() nounwind
|
2017-08-22 01:35:32 +08:00
|
|
|
; CHECK-LABEL: test_weak:
|
|
|
|
; CHECK: b foo_weak
|
|
|
|
; CHECK-NOT: nop
|
|
|
|
|
|
|
|
; SCM-LABEL: test_weak:
|
|
|
|
; SCM: bl foo_weak
|
|
|
|
; SCM-NEXT: nop
|
2012-09-19 03:51:44 +08:00
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
2012-09-19 00:47:58 +08:00
|
|
|
; Indirect calls requires a full stub creation
|
|
|
|
define void @test_indirect(void ()* nocapture %fp) nounwind {
|
2013-07-14 04:38:47 +08:00
|
|
|
; CHECK-LABEL: test_indirect:
|
2012-09-19 00:47:58 +08:00
|
|
|
tail call void %fp() nounwind
|
|
|
|
; CHECK: ld [[FP:[0-9]+]], 0(3)
|
|
|
|
; CHECK: ld 11, 16(3)
|
|
|
|
; CHECK: ld 2, 8(3)
|
|
|
|
; CHECK-NEXT: mtctr [[FP]]
|
|
|
|
; CHECK-NEXT: bctrl
|
|
|
|
; CHECK-NEXT: ld 2, 40(1)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
2014-06-19 01:28:56 +08:00
|
|
|
; Absolute values must use the regular indirect call sequence
|
|
|
|
; The main purpose of this test is to ensure that BLA is not
|
|
|
|
; used on 64-bit SVR4 (as e.g. on Darwin).
|
|
|
|
define void @test_abs() nounwind {
|
|
|
|
; CHECK-LABEL: test_abs:
|
|
|
|
tail call void inttoptr (i64 1024 to void ()*)() nounwind
|
|
|
|
; CHECK: ld [[FP:[0-9]+]], 1024(0)
|
|
|
|
; CHECK: ld 11, 1040(0)
|
[PowerPC] Simplify and improve loading into TOC register
During an indirect function call sequence on the 64-bit SVR4 ABI,
generate code must load and then restore the TOC register.
This does not use a regular LOAD instruction since the TOC
register r2 is marked as reserved. Instead, the are two
special instruction patterns:
let RST = 2, DS = 2 in
def LDinto_toc: DSForm_1a<58, 0, (outs), (ins g8rc:$reg),
"ld 2, 8($reg)", IIC_LdStLD,
[(PPCload_toc i64:$reg)]>, isPPC64;
let RST = 2, DS = 10, RA = 1 in
def LDtoc_restore : DSForm_1a<58, 0, (outs), (ins),
"ld 2, 40(1)", IIC_LdStLD,
[(PPCtoc_restore)]>, isPPC64;
Note that these not only restrict the destination of the
load to r2, but they also restrict the *source* of the
load to particular address combinations. The latter is
a problem when we want to support the ELFv2 ABI, since
there the TOC save slot is no longer at 40(1).
This patch replaces those two instructions with a single
instruction pattern that only hard-codes r2 as destination,
but supports generic addresses as source. This will allow
supporting the ELFv2 ABI, and also helps generate more
efficient code for calls to absolute addresses (allowing
simplification of the ppc64-calls.ll test case).
llvm-svn: 211193
2014-06-19 01:52:49 +08:00
|
|
|
; CHECK: ld 2, 1032(0)
|
|
|
|
; CHECK-NEXT: mtctr [[FP]]
|
|
|
|
; CHECK-NEXT: bctrl
|
2014-06-19 01:28:56 +08:00
|
|
|
; CHECK-NEXT: ld 2, 40(1)
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
2012-09-19 00:47:58 +08:00
|
|
|
declare double @sin(double) nounwind
|
|
|
|
|
|
|
|
; External functions call should also have a 'nop'
|
|
|
|
define double @test_external(double %x) nounwind {
|
2013-07-14 04:38:47 +08:00
|
|
|
; CHECK-LABEL: test_external:
|
2012-09-19 00:47:58 +08:00
|
|
|
%call = tail call double @sin(double %x) nounwind
|
|
|
|
; CHECK: bl sin
|
|
|
|
; CHECK-NEXT: nop
|
|
|
|
ret double %call
|
|
|
|
}
|
2014-12-24 06:29:40 +08:00
|
|
|
|
|
|
|
; The 'ld 2, 40(1)' really must always come directly after the bctrl to make
|
|
|
|
; the unwinding code in libgcc happy.
|
|
|
|
@g = external global void ()*
|
|
|
|
declare void @h(i64)
|
|
|
|
define void @test_indir_toc_reload(i64 %x) {
|
2015-02-28 05:17:42 +08:00
|
|
|
%1 = load void ()*, void ()** @g
|
2014-12-24 06:29:40 +08:00
|
|
|
call void %1()
|
|
|
|
call void @h(i64 %x)
|
|
|
|
ret void
|
|
|
|
|
|
|
|
; CHECK-LABEL: @test_indir_toc_reload
|
|
|
|
; CHECK: bctrl
|
|
|
|
; CHECK-NEXT: ld 2, 40(1)
|
|
|
|
; CHECK: blr
|
|
|
|
}
|
|
|
|
|