[AArch64] Fix save register pairing for Windows AAPCS
Summary:
On Windows, when a function does not have an unwind table (for example, EH
filtering funclets), we don't correctly pair FP and LR to form the frame record
in all circumstances.
Fix this by invalidating a pair when the second register is FP when compiling
for Windows, even when CFI is not needed.
Fixes PR44271 introduced by D65653.
Reviewers: efriedma, sdesmalen, rovka, rengolin, t.p.northover, thegameg, greened
Reviewed By: rengolin
Subscribers: kristof.beyls, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D71754
2020-01-14 21:16:57 +08:00
|
|
|
; RUN: llc -mtriple=arm64-windows -o - %s | FileCheck %s
|
|
|
|
|
|
|
|
declare void @f()
|
|
|
|
declare void @g()
|
|
|
|
|
|
|
|
; Function Attrs: nounwind
|
|
|
|
define dso_local void @SEHfilter() nounwind "frame-pointer"="all" {
|
|
|
|
; CHECK-LABEL: @SEHfilter
|
|
|
|
; CHECK: %bb.0:
|
|
|
|
; CHECK-NEXT: stp x30, x29, [sp, #-32]!
|
|
|
|
; CHECK-NEXT: str x19, [sp, #16]
|
|
|
|
; CHECK-NEXT: ldr w19, [x8]
|
|
|
|
; CHECK-NEXT: mov x29, sp
|
|
|
|
; CHECK-NEXT: bl g
|
|
|
|
; CHECK-NEXT: cbz w19, .LBB0_2
|
2021-02-08 21:24:42 +08:00
|
|
|
; CHECK-NEXT: // %bb.1:
|
[AArch64] Fix save register pairing for Windows AAPCS
Summary:
On Windows, when a function does not have an unwind table (for example, EH
filtering funclets), we don't correctly pair FP and LR to form the frame record
in all circumstances.
Fix this by invalidating a pair when the second register is FP when compiling
for Windows, even when CFI is not needed.
Fixes PR44271 introduced by D65653.
Reviewers: efriedma, sdesmalen, rovka, rengolin, t.p.northover, thegameg, greened
Reviewed By: rengolin
Subscribers: kristof.beyls, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D71754
2020-01-14 21:16:57 +08:00
|
|
|
; CHECK-NEXT: ldr x19, [sp, #16]
|
|
|
|
; CHECK-NEXT: ldp x30, x29, [sp], #32
|
|
|
|
; CHECK-NEXT: ret
|
2021-02-08 21:24:42 +08:00
|
|
|
; CHECK-NEXT: .LBB0_2: // %if.end.i
|
[AArch64] Fix save register pairing for Windows AAPCS
Summary:
On Windows, when a function does not have an unwind table (for example, EH
filtering funclets), we don't correctly pair FP and LR to form the frame record
in all circumstances.
Fix this by invalidating a pair when the second register is FP when compiling
for Windows, even when CFI is not needed.
Fixes PR44271 introduced by D65653.
Reviewers: efriedma, sdesmalen, rovka, rengolin, t.p.northover, thegameg, greened
Reviewed By: rengolin
Subscribers: kristof.beyls, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D71754
2020-01-14 21:16:57 +08:00
|
|
|
; CHECK-NEXT: bl f
|
|
|
|
; CHECK-NEXT: brk #0x1
|
|
|
|
%1 = load i32, i32* undef, align 4
|
|
|
|
tail call void @g()
|
|
|
|
%tobool.i = icmp eq i32 %1, 0
|
|
|
|
br i1 %tobool.i, label %if.end.i, label %exit
|
|
|
|
|
|
|
|
if.end.i:
|
|
|
|
call void @f()
|
|
|
|
unreachable
|
|
|
|
|
|
|
|
exit:
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|