[WinEH] Remove unreachable blocks before preparation
[oota-llvm.git] / test / CodeGen / WinEH / wineh-no-demotion.ll
1 ; RUN: opt -mtriple=x86_x64-pc-windows-msvc -S -winehprepare -disable-demotion < %s | FileCheck %s
2
3 declare i32 @__CxxFrameHandler3(...)
4
5 declare void @f()
6
7 declare i32 @g()
8
9 declare void @h(i32)
10
11 ; CHECK-LABEL: @test1(
12 define void @test1() personality i32 (...)* @__CxxFrameHandler3 {
13 entry:
14   invoke void @f()
15           to label %invoke.cont1 unwind label %left
16
17 invoke.cont1:
18   invoke void @f()
19           to label %invoke.cont2 unwind label %right
20
21 invoke.cont2:
22   invoke void @f()
23           to label %exit unwind label %inner
24
25 left:
26   %0 = cleanuppad []
27   br label %shared
28
29 right:
30   %1 = cleanuppad []
31   br label %shared
32
33 shared:
34   %x = call i32 @g()
35   invoke void @f()
36           to label %shared.cont unwind label %inner
37
38 shared.cont:
39   unreachable
40
41 inner:
42   ; CHECK: %phi = phi i32 [ %x, %right ], [ 0, %invoke.cont2 ], [ %x.for.left, %left ]
43   %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont2 ]
44   %i = cleanuppad []
45   call void @h(i32 %phi)
46   unreachable
47
48 exit:
49   unreachable
50 }
51
52 ; CHECK-LABEL: @test2(
53 define void @test2() personality i32 (...)* @__CxxFrameHandler3 {
54 entry:
55   invoke void @f()
56           to label %invoke.cont unwind label %left
57
58 invoke.cont:
59   invoke void @f()
60           to label %exit unwind label %right
61
62 left:
63   cleanuppad []
64   br label %shared
65
66 right:
67   cleanuppad []
68   br label %shared
69
70 shared:
71   %x = call i32 @g()
72   invoke void @f()
73           to label %shared.cont unwind label %inner
74
75 shared.cont:
76   unreachable
77
78 inner:
79   ; CHECK: %x1 = phi i32 [ %x.for.left, %left ], [ %x, %right ]
80   ; CHECK: call void @h(i32 %x1)
81   %i = cleanuppad []
82   call void @h(i32 %x)
83   unreachable
84
85 exit:
86   unreachable
87 }
88
89 ; CHECK-LABEL: @test3(
90 define void @test3() personality i32 (...)* @__CxxFrameHandler3 {
91 entry:
92   invoke void @f()
93           to label %invoke.cont unwind label %terminate
94
95 invoke.cont:
96   ret void
97
98 terminate:
99 ; CHECK:  cleanuppad []
100 ; CHECK:  call void @__std_terminate()
101 ; CHECK:  unreachable
102   terminatepad [void ()* @__std_terminate] unwind to caller
103 }
104
105 declare void @__std_terminate()