mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
8681d4c5a2
Summary: If a function needs to allocate both callee-save stack memory and local stack memory, we currently decrement/increment the SP in two steps: first for the callee-save area, and then for the local stack area. This changes the code to allocate them both at once at the very beginning/end of the function. This has two benefits: 1) there is one fewer sub/add micro-op in the prologue/epilogue 2) the stack adjustment instructions act as a scheduling barrier, so moving them to the very beginning/end of the function increases post-RA scheduler's ability to move instructions (that only depend on argument registers) before any of the callee-save stores This change can cause an increase in instructions if the original local stack SP decrement could be folded into the first store to the stack. This occurs when the first local stack store is to stack offset 0. In this case we are trading off one more sub instruction for one fewer sub micro-op (along with benefits (2) and (3) above). Reviewers: t.p.northover Subscribers: aemerson, rengolin, mcrosier, llvm-commits Differential Revision: http://reviews.llvm.org/D18619 llvm-svn: 268746
43 lines
1.4 KiB
LLVM
43 lines
1.4 KiB
LLVM
; RUN: llc -disable-fp-elim -O0 %s -mtriple aarch64-apple-darwin -o - | FileCheck %s
|
|
|
|
; int func(void);
|
|
; void prologue_end_test() {
|
|
; func();
|
|
; func();
|
|
; }
|
|
|
|
define void @prologue_end_test() nounwind uwtable !dbg !4 {
|
|
; CHECK: prologue_end_test:
|
|
; CHECK: .cfi_startproc
|
|
; CHECK: sub sp, sp
|
|
; CHECK: stp x29, x30
|
|
; CHECK: add x29, sp
|
|
; CHECK: .loc 1 3 3 prologue_end
|
|
; CHECK: bl _func
|
|
; CHECK: bl _func
|
|
entry:
|
|
%call = call i32 @func(), !dbg !11
|
|
%call1 = call i32 @func(), !dbg !12
|
|
ret void, !dbg !13
|
|
}
|
|
|
|
declare i32 @func()
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!7, !8, !9}
|
|
!llvm.ident = !{!10}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.7.0 (trunk 242129)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
|
|
!1 = !DIFile(filename: "foo.c", directory: "/tmp")
|
|
!2 = !{}
|
|
!4 = distinct !DISubprogram(name: "prologue_end_test", scope: !1, file: !1, line: 2, type: !5, isLocal: false, isDefinition: true, scopeLine: 2, isOptimized: false, unit: !0, variables: !2)
|
|
!5 = !DISubroutineType(types: !6)
|
|
!6 = !{null}
|
|
!7 = !{i32 2, !"Dwarf Version", i32 2}
|
|
!8 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!9 = !{i32 1, !"PIC Level", i32 2}
|
|
!10 = !{!"clang version 3.7.0 (trunk 242129)"}
|
|
!11 = !DILocation(line: 3, column: 3, scope: !4)
|
|
!12 = !DILocation(line: 4, column: 3, scope: !4)
|
|
!13 = !DILocation(line: 5, column: 1, scope: !4)
|