4f023947caa7dff657ba6863dc58e1660a7465fe
[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   %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont2 ]
43   %i = cleanuppad []
44   call void @h(i32 %phi)
45   unreachable
46
47 ; CHECK [[INNER_INVOKE_CONT2:inner.*]]:
48   ; CHECK: call void @h(i32 0)
49
50 ; CHECK [[INNER_RIGHT:inner.*]]:
51   ; CHECK: call void @h(i32 %x)
52
53 ; CHECK [[INNER_LEFT:inner.*]]:
54   ; CHECK: call void @h(i32 %x.for.left)
55
56 exit:
57   unreachable
58 }
59
60 ; CHECK-LABEL: @test2(
61 define void @test2() personality i32 (...)* @__CxxFrameHandler3 {
62 entry:
63   invoke void @f()
64           to label %invoke.cont unwind label %left
65
66 invoke.cont:
67   invoke void @f()
68           to label %exit unwind label %right
69
70 left:
71   cleanuppad []
72   br label %shared
73
74 right:
75   cleanuppad []
76   br label %shared
77
78 shared:
79   %x = call i32 @g()
80   invoke void @f()
81           to label %shared.cont unwind label %inner
82
83 shared.cont:
84   unreachable
85
86 inner:
87   %i = cleanuppad []
88   call void @h(i32 %x)
89   unreachable
90
91 ; CHECK [[INNER_RIGHT:inner.*]]:
92   ; CHECK: call void @h(i32 %x)
93
94 ; CHECK [[INNER_LEFT:inner.*]]:
95   ; CHECK: call void @h(i32 %x.for.left)
96
97 exit:
98   unreachable
99 }
100
101 ; CHECK-LABEL: @test3(
102 define void @test3() personality i32 (...)* @__CxxFrameHandler3 {
103 entry:
104   invoke void @f()
105           to label %invoke.cont unwind label %terminate
106
107 invoke.cont:
108   ret void
109
110 terminate:
111 ; CHECK:  cleanuppad []
112 ; CHECK:  call void @__std_terminate()
113 ; CHECK:  unreachable
114   terminatepad [void ()* @__std_terminate] unwind to caller
115 }
116
117 declare void @__std_terminate()