forked from OSchip/llvm-project
68 lines
2.1 KiB
LLVM
68 lines
2.1 KiB
LLVM
; RUN: llc -mtriple arm64-windows -o - %s | FileCheck %s
|
|
|
|
; Function Attrs: noinline optnone uwtable
|
|
define dso_local i32 @foo() {
|
|
entry:
|
|
; CHECK-LABEL: foo
|
|
; CHECK: orr w8, wzr, #0x1
|
|
; CHECK: mov w0, wzr
|
|
; CHECK: mov x1, x29
|
|
; CHECK: .set .Lfoo$frame_escape_0, -4
|
|
; CHECK: stur w8, [x29, #-4]
|
|
; CHECK: bl "?fin$0@0@foo@@"
|
|
; CHECK: ldur w0, [x29, #-4]
|
|
|
|
%count = alloca i32, align 4
|
|
call void (...) @llvm.localescape(i32* %count)
|
|
store i32 0, i32* %count, align 4
|
|
%0 = load i32, i32* %count, align 4
|
|
%add = add nsw i32 %0, 1
|
|
store i32 %add, i32* %count, align 4
|
|
%1 = call i8* @llvm.localaddress()
|
|
call void @"?fin$0@0@foo@@"(i8 0, i8* %1)
|
|
%2 = load i32, i32* %count, align 4
|
|
ret i32 %2
|
|
}
|
|
|
|
define internal void @"?fin$0@0@foo@@"(i8 %abnormal_termination, i8* %frame_pointer) {
|
|
entry:
|
|
; CHECK-LABEL: @"?fin$0@0@foo@@"
|
|
; CHECK: sub sp, sp, #16
|
|
; CHECK: str x1, [sp, #8]
|
|
; CHECK: strb w0, [sp, #7]
|
|
; CHECK: movz x8, #:abs_g1_s:.Lfoo$frame_escape_0
|
|
; CHECK: movk x8, #:abs_g0_nc:.Lfoo$frame_escape_0
|
|
; CHECK: add x8, x1, x8
|
|
; CHECK: ldr w9, [x8]
|
|
; CHECK: add w9, w9, #1
|
|
; CHECK: str w9, [x8]
|
|
|
|
%frame_pointer.addr = alloca i8*, align 8
|
|
%abnormal_termination.addr = alloca i8, align 1
|
|
%0 = call i8* @llvm.localrecover(i8* bitcast (i32 ()* @foo to i8*), i8* %frame_pointer, i32 0)
|
|
%count = bitcast i8* %0 to i32*
|
|
store i8* %frame_pointer, i8** %frame_pointer.addr, align 8
|
|
store i8 %abnormal_termination, i8* %abnormal_termination.addr, align 1
|
|
%1 = zext i8 %abnormal_termination to i32
|
|
%cmp = icmp eq i32 %1, 0
|
|
br i1 %cmp, label %if.then, label %if.end
|
|
|
|
if.then: ; preds = %entry
|
|
%2 = load i32, i32* %count, align 4
|
|
%add = add nsw i32 %2, 1
|
|
store i32 %add, i32* %count, align 4
|
|
br label %if.end
|
|
|
|
if.end: ; preds = %if.then, %entry
|
|
ret void
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare i8* @llvm.localrecover(i8*, i8*, i32)
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare i8* @llvm.localaddress()
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @llvm.localescape(...)
|