-; RUN: opt -mtriple=x86_x64-pc-windows-msvc -S -winehprepare -disable-demotion < %s | FileCheck %s
+; RUN: opt -mtriple=x86_x64-pc-windows-msvc -S -winehprepare -disable-demotion -disable-cleanups < %s | FileCheck %s
declare i32 @__CxxFrameHandler3(...)
declare void @h(i32)
; CHECK-LABEL: @test1(
-define void @test1() personality i32 (...)* @__C_specific_handler {
+define void @test1(i1 %bool) personality i32 (...)* @__C_specific_handler {
entry:
invoke void @f()
- to label %invoke.cont1 unwind label %left
-
-invoke.cont1:
- invoke void @f()
- to label %invoke.cont2 unwind label %right
+ to label %invoke.cont unwind label %left
-invoke.cont2:
+invoke.cont:
invoke void @f()
to label %exit unwind label %inner
left:
%0 = cleanuppad within none []
- br label %shared
+ br i1 %bool, label %shared, label %cleanupret
+
+cleanupret:
+ cleanupret from %0 unwind label %right
right:
%1 = cleanuppad within none []
shared:
%x = call i32 @g()
- invoke void @f()
+ invoke void @f() [ "funclet"(token %0) ]
to label %shared.cont unwind label %inner
shared.cont:
unreachable
inner:
- %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont2 ]
+ %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ]
%i = cleanuppad within none []
call void @h(i32 %phi)
unreachable
-; CHECK: %phi = phi i32 [ %x, %right ], [ 0, %invoke.cont2 ], [ %x.for.left, %left ]
+; CHECK: %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ], [ %x.for.left, %shared.for.left ]
; CHECK: %i = cleanuppad within none []
; CHECK: call void @h(i32 %phi)
}
; CHECK-LABEL: @test2(
-define void @test2() personality i32 (...)* @__C_specific_handler {
+define void @test2(i1 %bool) personality i32 (...)* @__C_specific_handler {
entry:
invoke void @f()
- to label %invoke.cont unwind label %left
-
-invoke.cont:
- invoke void @f()
- to label %exit unwind label %right
+ to label %shared.cont unwind label %left
left:
- cleanuppad within none []
- br label %shared
+ %0 = cleanuppad within none []
+ br i1 %bool, label %shared, label %cleanupret
+
+cleanupret:
+ cleanupret from %0 unwind label %right
right:
- cleanuppad within none []
+ %1 = cleanuppad within none []
br label %shared
shared:
%x = call i32 @g()
- invoke void @f()
+ invoke void @f() [ "funclet"(token %0) ]
to label %shared.cont unwind label %inner
shared.cont:
call void @h(i32 %x)
unreachable
-; CHECK: %x1 = phi i32 [ %x.for.left, %left ], [ %x, %right ]
-; CHECK: %i = cleanuppad within none []
-; CHECK: call void @h(i32 %x1)
+; CHECK: %x1 = phi i32 [ %x.for.left, %shared.for.left ], [ %x, %shared ]
+; CHECK: %i = cleanuppad within none []
+; CHECK: call void @h(i32 %x1)
exit:
unreachable
call void @h(i32 %phi)
unreachable
-; CHECK: %0 = cleanuppad within none []
-; CHECK: call void @h(i32 1)
-
-; CHECK: %1 = cleanuppad within none []
; CHECK: %phi = phi i32 [ 0, %right ], [ -1, %right.other ]
; CHECK: call void @h(i32 %phi)
+; CHECK: %phi.for.left = phi i32 [ 1, %left ]
+; CHECK: call void @h(i32 %phi.for.left)
+
exit:
unreachable
}