1 ; RUN: llc -mtriple x86_64-pc-windows-msvc < %s | FileCheck %s
3 define void @two_invoke_merged() {
5 invoke void @try_body()
6 to label %again unwind label %lpad
9 invoke void @try_body()
10 to label %done unwind label %lpad
16 %vals = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
17 catch i8* bitcast (i32 (i8*, i8*)* @filt0 to i8*)
18 catch i8* bitcast (i32 (i8*, i8*)* @filt1 to i8*)
19 %sel = extractvalue { i8*, i32 } %vals, 1
20 call void @use_selector(i32 %sel)
26 ; CHECK-LABEL: {{^}}two_invoke_merged:
27 ; CHECK: .seh_proc two_invoke_merged
28 ; CHECK: .seh_handler __C_specific_handler, @unwind, @except
30 ; CHECK: callq try_body
33 ; CHECK: callq try_body
40 ; CHECK: movl $1, %ecx
43 ; CHECK: movl $2, %ecx
44 ; CHECK: callq use_selector
46 ; CHECK: .seh_handlerdata
48 ; CHECK-NEXT: .long .Ltmp0@IMGREL
49 ; CHECK-NEXT: .long .Ltmp3@IMGREL+1
50 ; CHECK-NEXT: .long filt0@IMGREL
51 ; CHECK-NEXT: .long .Ltmp5@IMGREL
52 ; CHECK-NEXT: .long .Ltmp0@IMGREL
53 ; CHECK-NEXT: .long .Ltmp3@IMGREL+1
54 ; CHECK-NEXT: .long filt1@IMGREL
55 ; CHECK-NEXT: .long .Ltmp6@IMGREL
59 define void @two_invoke_gap() {
61 invoke void @try_body()
62 to label %again unwind label %lpad
65 call void @do_nothing_on_unwind()
66 invoke void @try_body()
67 to label %done unwind label %lpad
73 %vals = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
74 catch i8* bitcast (i32 (i8*, i8*)* @filt0 to i8*)
75 %sel = extractvalue { i8*, i32 } %vals, 1
76 call void @use_selector(i32 %sel)
82 ; CHECK-LABEL: {{^}}two_invoke_gap:
83 ; CHECK: .seh_proc two_invoke_gap
84 ; CHECK: .seh_handler __C_specific_handler, @unwind, @except
86 ; CHECK: callq try_body
87 ; CHECK-NEXT: .Ltmp12:
88 ; CHECK: callq do_nothing_on_unwind
90 ; CHECK: callq try_body
91 ; CHECK-NEXT: .Ltmp14:
97 ; CHECK: movl $1, %ecx
98 ; CHECK: callq use_selector
100 ; CHECK: .seh_handlerdata
101 ; CHECK-NEXT: .long 2
102 ; CHECK-NEXT: .long .Ltmp11@IMGREL
103 ; CHECK-NEXT: .long .Ltmp12@IMGREL+1
104 ; CHECK-NEXT: .long filt0@IMGREL
105 ; CHECK-NEXT: .long .Ltmp16@IMGREL
106 ; CHECK-NEXT: .long .Ltmp13@IMGREL
107 ; CHECK-NEXT: .long .Ltmp14@IMGREL+1
108 ; CHECK-NEXT: .long filt0@IMGREL
109 ; CHECK-NEXT: .long .Ltmp16@IMGREL
111 ; CHECK: .seh_endproc
113 define void @two_invoke_nounwind_gap() {
115 invoke void @try_body()
116 to label %again unwind label %lpad
119 call void @cannot_unwind()
120 invoke void @try_body()
121 to label %done unwind label %lpad
127 %vals = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*)
128 catch i8* bitcast (i32 (i8*, i8*)* @filt0 to i8*)
129 %sel = extractvalue { i8*, i32 } %vals, 1
130 call void @use_selector(i32 %sel)
136 ; CHECK-LABEL: {{^}}two_invoke_nounwind_gap:
137 ; CHECK: .seh_proc two_invoke_nounwind_gap
138 ; CHECK: .seh_handler __C_specific_handler, @unwind, @except
140 ; CHECK: callq try_body
141 ; CHECK-NEXT: .Ltmp22:
142 ; CHECK: callq cannot_unwind
144 ; CHECK: callq try_body
145 ; CHECK-NEXT: .Ltmp24:
151 ; CHECK: movl $1, %ecx
152 ; CHECK: callq use_selector
154 ; CHECK: .seh_handlerdata
155 ; CHECK-NEXT: .long 1
156 ; CHECK-NEXT: .long .Ltmp21@IMGREL
157 ; CHECK-NEXT: .long .Ltmp24@IMGREL+1
158 ; CHECK-NEXT: .long filt0@IMGREL
159 ; CHECK-NEXT: .long .Ltmp26@IMGREL
161 ; CHECK: .seh_endproc
163 declare void @try_body()
164 declare void @do_nothing_on_unwind()
165 declare void @cannot_unwind() nounwind
166 declare void @use_selector(i32)
168 declare i32 @filt0(i8* %eh_info, i8* %rsp)
169 declare i32 @filt1(i8* %eh_info, i8* %rsp)
171 declare void @handler0()
172 declare void @handler1()
174 declare i32 @__C_specific_handler(...)
175 declare i32 @llvm.eh.typeid.for(i8*) readnone nounwind