]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/catchret-regmask.ll
Vendor import of llvm trunk r351319 (just before the release_80 branch
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / catchret-regmask.ll
1 ; RUN: llc < %s | FileCheck %s
2
3 target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4 target triple = "x86_64-pc-windows-msvc"
5
6 declare i32 @__CxxFrameHandler3(...)
7 declare void @throw() noreturn uwtable
8 declare i8* @getval()
9
10 define i8* @reload_out_of_pad(i8* %arg) #0 personality i32 (...)* @__CxxFrameHandler3 {
11 assertPassed:
12   invoke void @throw()
13           to label %unreachable unwind label %catch.dispatch
14
15 catch:
16   %cp = catchpad within %cs [i8* null, i32 0, i8* null]
17   catchret from %cp to label %return
18
19   ; This block *must* appear after the catchret to test the bug.
20   ; FIXME: Make this an MIR test so we can control MBB layout.
21 unreachable:
22   unreachable
23
24 catch.dispatch:
25   %cs = catchswitch within none [label %catch] unwind to caller
26
27 return:
28   ret i8* %arg
29 }
30
31 ; CHECK-LABEL: reload_out_of_pad: # @reload_out_of_pad
32 ; CHECK: movq %rcx, -[[arg_slot:[0-9]+]](%rbp) # 8-byte Spill
33 ; CHECK: callq throw
34 ; CHECK: ud2
35 ; CHECK: movq -[[arg_slot]](%rbp), %rax # 8-byte Reload
36 ; CHECK: retq
37
38 ; CHECK: "?catch$3@?0?reload_out_of_pad@4HA":
39 ; CHECK-NOT: Reload
40 ; CHECK: retq
41
42 define i8* @spill_in_pad() #0 personality i32 (...)* @__CxxFrameHandler3 {
43 assertPassed:
44   invoke void @throw()
45           to label %unreachable unwind label %catch.dispatch
46
47 catch:
48   %cp = catchpad within %cs [i8* null, i32 0, i8* null]
49   %val = call i8* @getval() [ "funclet"(token %cp) ]
50   catchret from %cp to label %return
51
52 unreachable:
53   unreachable
54
55 catch.dispatch:
56   %cs = catchswitch within none [label %catch] unwind to caller
57
58 return:
59   ret i8* %val
60 }
61
62 ; CHECK-LABEL: spill_in_pad: # @spill_in_pad
63 ; CHECK: callq throw
64 ; CHECK: ud2
65 ; CHECK: movq -[[val_slot:[0-9]+]](%rbp), %rax # 8-byte Reload
66 ; CHECK: retq
67
68 ; CHECK: "?catch$3@?0?spill_in_pad@4HA":
69 ; CHECK: callq getval
70 ; CHECK: movq %rax, -[[val_slot]](%rbp) # 8-byte Spill
71 ; CHECK: retq
72
73 attributes #0 = { uwtable }