1 ; RUN: opt -S -inline < %s | FileCheck %s 2 target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" 3 target triple = "i686-pc-windows-msvc18.0.0" 4 5 declare void @g(i32) 6 7 define void @f() personality i32 (...)* @__CxxFrameHandler3 { 8 entry: 9 invoke void @g(i32 0) 10 to label %invoke.cont unwind label %cs.bb 11 12 invoke.cont: 13 ret void 14 15 cs.bb: 16 %cs = catchswitch within none [label %cp.bb] unwind label %cleanup.bb 17 18 cp.bb: 19 %cpouter1 = catchpad within %cs [i8* null, i32 0, i8* null] 20 call void @dtor() #1 [ "funclet"(token %cpouter1) ] 21 catchret from %cpouter1 to label %invoke.cont 22 23 cleanup.bb: 24 %cpouter2 = cleanuppad within none [] 25 call void @g(i32 1) [ "funclet"(token %cpouter2) ] 26 cleanupret from %cpouter2 unwind to caller 27 } 28 29 declare i32 @__CxxFrameHandler3(...) 30 31 ; Function Attrs: nounwind 32 define internal void @dtor() #1 personality i32 (...)* @__CxxFrameHandler3 { 33 entry: 34 invoke void @g(i32 2) 35 to label %invoke.cont unwind label %ehcleanup1 36 37 invoke.cont: 38 ret void 39 40 ehcleanup1: 41 %cpinner1 = cleanuppad within none [] 42 invoke void @g(i32 3) [ "funclet" (token %cpinner1) ] 43 to label %done unwind label %ehcleanup2 44 done: 45 unreachable 46 47 ehcleanup2: 48 %cpinner2 = cleanuppad within %cpinner1 [] 49 call void @g(i32 4) [ "funclet" (token %cpinner2) ] 50 cleanupret from %cpinner2 unwind to caller 51 } 52 53 ; CHECK-LABEL: define void @f( 54 55 ; CHECK: %[[cs:.*]] = catchswitch within none 56 57 ; CHECK: %[[cpouter1:.*]] = catchpad within %[[cs]] 58 59 ; CHECK: %[[cpinner1:.*]] = cleanuppad within %[[cpouter1]] 60 61 ; CHECK: %[[cpinner2:.*]] = cleanuppad within %[[cpinner1]] 62 ; CHECK-NEXT: call void @g(i32 4) #0 [ "funclet"(token %[[cpinner2]]) ] 63 ; CHECK-NEXT: unreachable 64 65 attributes #1 = { nounwind } 66