mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[AArch64] Save FP for leaf functions when disabling frame pointer elimination
The change allows clang -mno-omit-leaf-frame-pointer to disable frame pointer elimination. This behavior matches X86 and Mips, and also GCC AArch64. Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D71168
This commit is contained in:
parent
aea1c9f58c
commit
0973858503
@ -244,7 +244,7 @@ bool AArch64FrameLowering::hasFP(const MachineFunction &MF) const {
|
||||
if (MF.hasEHFunclets())
|
||||
return true;
|
||||
// Retain behavior of always omitting the FP for leaf functions when possible.
|
||||
if (MFI.hasCalls() && MF.getTarget().Options.DisableFramePointerElim(MF))
|
||||
if (MF.getTarget().Options.DisableFramePointerElim(MF))
|
||||
return true;
|
||||
if (MFI.hasVarSizedObjects() || MFI.isFrameAddressTaken() ||
|
||||
MFI.hasStackMap() || MFI.hasPatchPoint() ||
|
||||
|
@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc %s -verify-machineinstrs -mtriple aarch64-apple-darwin -global-isel -global-isel-abort=1 -o - 2>&1 | FileCheck %s
|
||||
; RUN: llc %s -verify-machineinstrs -mtriple aarch64-apple-darwin -global-isel -global-isel-abort=1 -frame-pointer=non-leaf -o - 2>&1 | FileCheck %s
|
||||
|
||||
; Check that we get a tail call to foo without saving fp/lr.
|
||||
define void @bar(i32 %a) #1 {
|
||||
@ -12,6 +12,9 @@ entry:
|
||||
}
|
||||
|
||||
define void @zoo(i32 %a) {
|
||||
; CHECK-LABEL: zoo:
|
||||
; CHECK: ; %bb.0: ; %entry
|
||||
; CHECK-NEXT: ret
|
||||
entry:
|
||||
ret void
|
||||
}
|
||||
|
@ -3,19 +3,19 @@
|
||||
; therefore, the tests are a bit fragile/reliant on instruction scheduling. The
|
||||
; test cases have been minimized as much as possible, but still most of the test
|
||||
; cases could break if instruction scheduling heuristics for cortex-a53 change
|
||||
; RUN: llc < %s -mcpu=cortex-a53 -aarch64-fix-cortex-a53-835769=1 -stats 2>&1 \
|
||||
; RUN: llc < %s -mcpu=cortex-a53 -aarch64-fix-cortex-a53-835769=1 -frame-pointer=non-leaf -stats 2>&1 \
|
||||
; RUN: | FileCheck %s
|
||||
; RUN: llc < %s -mcpu=cortex-a53 -aarch64-fix-cortex-a53-835769=0 -stats 2>&1 \
|
||||
; RUN: llc < %s -mcpu=cortex-a53 -aarch64-fix-cortex-a53-835769=0 -frame-pointer=non-leaf -stats 2>&1 \
|
||||
; RUN: | FileCheck %s --check-prefix CHECK-NOWORKAROUND
|
||||
; The following run lines are just to verify whether or not this pass runs by
|
||||
; default for given CPUs. Given the fragility of the tests, this is only run on
|
||||
; a test case where the scheduler has not freedom at all to reschedule the
|
||||
; instructions, so the potentially massively different scheduling heuristics
|
||||
; will not break the test case.
|
||||
; RUN: llc < %s -mcpu=generic | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
|
||||
; RUN: llc < %s -mcpu=cortex-a53 | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
|
||||
; RUN: llc < %s -mcpu=cortex-a57 | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
|
||||
; RUN: llc < %s -mcpu=cyclone | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
|
||||
; RUN: llc < %s -mcpu=generic -frame-pointer=non-leaf | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
|
||||
; RUN: llc < %s -mcpu=cortex-a53 -frame-pointer=non-leaf | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
|
||||
; RUN: llc < %s -mcpu=cortex-a57 -frame-pointer=non-leaf | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
|
||||
; RUN: llc < %s -mcpu=cyclone -frame-pointer=non-leaf | FileCheck %s --check-prefix CHECK-BASIC-PASS-DISABLED
|
||||
|
||||
target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
|
||||
target triple = "aarch64--linux-gnu"
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc -verify-machineinstrs -mtriple=arm64-none-linux-gnu -frame-pointer=all -disable-post-ra < %s | FileCheck %s
|
||||
; RUN: llc -verify-machineinstrs -mtriple=arm64-none-linux-gnu -frame-pointer=non-leaf -disable-post-ra < %s | FileCheck %s
|
||||
declare void @use_addr(i8*)
|
||||
|
||||
@addr = global i8* null
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc %s -o - -mtriple=arm64-apple-ios -enable-shrink-wrap=true -disable-post-ra -frame-pointer=all | FileCheck %s --check-prefix=ENABLE
|
||||
; RUN: llc %s -o - -enable-shrink-wrap=false -disable-post-ra -frame-pointer=all | FileCheck %s --check-prefix=DISABLE
|
||||
; RUN: llc %s -o - -mtriple=arm64-apple-ios -enable-shrink-wrap=true -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=ENABLE
|
||||
; RUN: llc %s -o - -enable-shrink-wrap=false -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=DISABLE
|
||||
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
||||
target triple = "arm64-apple-ios"
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
; RUN: llc -mtriple=arm64_32-apple-ios7.0 %s -filetype=obj -o - -disable-post-ra -frame-pointer=all | \
|
||||
; RUN: llc -mtriple=arm64_32-apple-ios7.0 %s -filetype=obj -o - -disable-post-ra -frame-pointer=non-leaf | \
|
||||
; RUN: llvm-objdump -private-headers - | \
|
||||
; RUN: FileCheck %s --check-prefix=CHECK-MACHO
|
||||
; RUN: llc -mtriple=arm64_32-apple-ios7.0 %s -o - -aarch64-enable-atomic-cfg-tidy=0 -disable-post-ra -frame-pointer=all | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-OPT
|
||||
; RUN: llc -mtriple=arm64_32-apple-ios7.0 %s -o - -fast-isel -aarch64-enable-atomic-cfg-tidy=0 -disable-post-ra -frame-pointer=all | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-FAST
|
||||
; RUN: llc -mtriple=arm64_32-apple-ios7.0 %s -o - -aarch64-enable-atomic-cfg-tidy=0 -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-OPT
|
||||
; RUN: llc -mtriple=arm64_32-apple-ios7.0 %s -o - -fast-isel -aarch64-enable-atomic-cfg-tidy=0 -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-FAST
|
||||
|
||||
; CHECK-MACHO: Mach header
|
||||
; CHECK-MACHO: MH_MAGIC ARM64_32 V8
|
||||
|
@ -1,14 +1,14 @@
|
||||
; RUN: llc < %s -mtriple aarch64-unknown-unknown -aarch64-neon-syntax=apple -asm-verbose=false -disable-post-ra -frame-pointer=all | FileCheck %s --check-prefix=CHECK-CVT --check-prefix=CHECK-COMMON
|
||||
; RUN: llc < %s -mtriple aarch64-unknown-unknown -mattr=+fullfp16 -aarch64-neon-syntax=apple -asm-verbose=false -disable-post-ra -frame-pointer=all | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-FP16
|
||||
; RUN: llc < %s -mtriple aarch64-unknown-unknown -aarch64-neon-syntax=apple -asm-verbose=false -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=CHECK-CVT --check-prefix=CHECK-COMMON
|
||||
; RUN: llc < %s -mtriple aarch64-unknown-unknown -mattr=+fullfp16 -aarch64-neon-syntax=apple -asm-verbose=false -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-FP16
|
||||
|
||||
; RUN: llc < %s -mtriple aarch64-unknown-unknown -aarch64-neon-syntax=apple \
|
||||
; RUN: -asm-verbose=false -disable-post-ra -frame-pointer=all -global-isel \
|
||||
; RUN: -asm-verbose=false -disable-post-ra -frame-pointer=non-leaf -global-isel \
|
||||
; RUN: -global-isel-abort=2 -pass-remarks-missed=gisel-* 2>&1 | FileCheck %s \
|
||||
; RUN: --check-prefixes=FALLBACK,GISEL-CVT,GISEL
|
||||
|
||||
; RUN: llc < %s -mtriple aarch64-unknown-unknown -mattr=+fullfp16 \
|
||||
; RUN: -aarch64-neon-syntax=apple -asm-verbose=false -disable-post-ra \
|
||||
; RUN: -frame-pointer=all -global-isel -global-isel-abort=2 \
|
||||
; RUN: -frame-pointer=non-leaf -global-isel -global-isel-abort=2 \
|
||||
; RUN: -pass-remarks-missed=gisel-* 2>&1 | FileCheck %s \
|
||||
; RUN: --check-prefixes=FALLBACK-FP16,GISEL-FP16,GISEL
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=all -tailcallopt | FileCheck %s -check-prefix CHECK-TAIL
|
||||
; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=all | FileCheck %s
|
||||
; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=all -tailcallopt -aarch64-redzone | FileCheck %s -check-prefix CHECK-TAIL-RZ
|
||||
; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=non-leaf -tailcallopt | FileCheck %s -check-prefix CHECK-TAIL
|
||||
; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=non-leaf | FileCheck %s
|
||||
; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -frame-pointer=non-leaf -tailcallopt -aarch64-redzone | FileCheck %s -check-prefix CHECK-TAIL-RZ
|
||||
|
||||
; Without tailcallopt fastcc still means the caller cleans up the
|
||||
; stack, so try to make sure this is respected.
|
||||
|
@ -101,6 +101,7 @@ tracksRegLiveness: true
|
||||
body: |
|
||||
bb.0:
|
||||
liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28
|
||||
$lr = ORRXri $xzr, 1
|
||||
$w10 = ORRWri $wzr, 1
|
||||
$w10 = ORRWri $wzr, 1
|
||||
$w10 = ORRWri $wzr, 1
|
||||
|
@ -1,4 +1,4 @@
|
||||
# RUN: llc -mtriple=aarch64--- -run-pass=prologepilog -run-pass=machine-outliner -verify-machineinstrs %s -o - | FileCheck %s
|
||||
# RUN: llc -mtriple=aarch64--- -run-pass=prologepilog -run-pass=machine-outliner -verify-machineinstrs -frame-pointer=non-leaf %s -o - | FileCheck %s
|
||||
--- |
|
||||
|
||||
@x = common global i32 0, align 4
|
||||
|
@ -3,4 +3,4 @@
|
||||
|
||||
; check line table length is correctly calculated for both big and little endian
|
||||
CHECK-LABEL: .debug_line contents:
|
||||
CHECK: total_length: 0x0000003f
|
||||
CHECK: total_length: 0x00000040
|
||||
|
Loading…
x
Reference in New Issue
Block a user