mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
da7fa59d26
Add support for sibcalling calls whose calling convention differs from the caller's. - Port over `CCState::resultsCombatible` from CallingConvLower.cpp into CallLowering. This is used to verify that the way the caller and callee CC handle incoming arguments matches up. - Add `CallLowering::analyzeCallResult`. This is basically a port of `CCState::AnalyzeCallResult`, but using `ArgInfo` rather than `ISD::InputArg`. - Add `AArch64CallLowering::doCallerAndCalleePassArgsTheSameWay`. This checks that the calling conventions are compatible, and that the caller and callee preserve the same registers. For testing: - Update call-translator-tail-call.ll to show that we can now handle this. - Add a GISel line to tailcall-ccmismatch.ll to show that we will not tail call when the regmasks don't line up. Differential Revision: https://reviews.llvm.org/D67361 llvm-svn: 371570
26 lines
877 B
LLVM
26 lines
877 B
LLVM
; RUN: llc -o - %s | FileCheck %s
|
|
; RUN: llc -global-isel -verify-machineinstrs -o - %s | FileCheck %s
|
|
target triple="aarch64--"
|
|
|
|
declare void @somefunc()
|
|
define preserve_mostcc void @test_ccmismatch_notail() {
|
|
; Ensure that no tail call is used here, as the called function somefunc does
|
|
; not preserve enough registers for preserve_mostcc.
|
|
; CHECK-LABEL: test_ccmismatch_notail:
|
|
; CHECK-NOT: b somefunc
|
|
; CHECK: bl somefunc
|
|
tail call void @somefunc()
|
|
ret void
|
|
}
|
|
|
|
declare preserve_mostcc void @some_preserve_most_func()
|
|
define void @test_ccmismatch_tail() {
|
|
; We can perform a tail call here, because some_preserve_most_func preserves
|
|
; all registers necessary for test_ccmismatch_tail.
|
|
; CHECK-LABEL: test_ccmismatch_tail:
|
|
; CHECK-NOT: bl some_preserve_most_func
|
|
; CHECK: b some_preserve_most_func
|
|
tail call preserve_mostcc void @some_preserve_most_func()
|
|
ret void
|
|
}
|