mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
8cf92aa718
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
36 lines
892 B
LLVM
36 lines
892 B
LLVM
; 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
|
|
; CHECK-NEXT: ; %bb.1:
|
|
; CHECK-NEXT: ldr x19, [sp, #16]
|
|
; CHECK-NEXT: ldp x30, x29, [sp], #32
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .LBB0_2: ; %if.end.i
|
|
; 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
|
|
}
|
|
|