Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / WinEH / wineh-no-demotion.ll
blobd4667db97cc141740c684957eb11c80e5fbe4751
1 ; RUN: opt -mtriple=x86_64-pc-windows-msvc -S -win-eh-prepare -disable-demotion -disable-cleanups < %s | FileCheck %s
2 ; RUN: opt -mtriple=x86_64-pc-windows-msvc -S -passes=win-eh-prepare -disable-demotion -disable-cleanups < %s | FileCheck %s
4 declare i32 @__CxxFrameHandler3(...)
6 declare i32 @__C_specific_handler(...)
8 declare void @f()
10 declare i32 @g()
12 declare void @h(i32)
14 ; CHECK-LABEL: @test1(
15 define void @test1(i1 %bool) personality ptr @__C_specific_handler {
16 entry:
17   invoke void @f()
18           to label %invoke.cont unwind label %left
20 invoke.cont:
21   invoke void @f()
22           to label %exit unwind label %inner
24 left:
25   %0 = cleanuppad within none []
26   br i1 %bool, label %shared, label %cleanupret
28 cleanupret:
29   cleanupret from %0 unwind label %right
31 right:
32   %1 = cleanuppad within none []
33   br label %shared
35 shared:
36   %x = call i32 @g()
37   invoke void @f()
38           to label %shared.cont unwind label %inner
40 shared.cont:
41   unreachable
43 inner:
44   %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ]
45   %i = cleanuppad within none []
46   call void @h(i32 %phi)
47   unreachable
49 ; CHECK: %phi = phi i32 [ %x, %shared ], [ 0, %invoke.cont ], [ %x.for.left, %shared.for.left ]
50 ; CHECK: %i = cleanuppad within none []
51 ; CHECK: call void @h(i32 %phi)
53 exit:
54   unreachable
57 ; CHECK-LABEL: @test2(
58 define void @test2(i1 %bool) personality ptr @__C_specific_handler {
59 entry:
60   invoke void @f()
61           to label %shared.cont unwind label %left
63 left:
64   %0 = cleanuppad within none []
65   br i1 %bool, label %shared, label %cleanupret
67 cleanupret:
68   cleanupret from %0 unwind label %right
70 right:
71   %1 = cleanuppad within none []
72   br label %shared
74 shared:
75   %x = call i32 @g()
76   invoke void @f()
77           to label %shared.cont unwind label %inner
79 shared.cont:
80   unreachable
82 inner:
83   %i = cleanuppad within none []
84   call void @h(i32 %x)
85   unreachable
87 ; CHECK: %x1 = phi i32 [ %x.for.left, %shared.for.left ], [ %x, %shared ]
88 ; CHECK: %i = cleanuppad within none []
89 ; CHECK: call void @h(i32 %x1)
91 exit:
92   unreachable
95 ; CHECK-LABEL: @test4(
96 define void @test4(i1 %x) personality ptr @__CxxFrameHandler3 {
97 entry:
98   invoke void @f()
99           to label %invoke.cont1 unwind label %left
101 invoke.cont1:
102   invoke void @f()
103           to label %exit unwind label %right
105 left:
106   %0 = cleanuppad within none []
107   br label %shared
109 right:
110   %1 = cleanuppad within none []
111   br i1 %x, label %shared, label %right.other
113 right.other:
114   br label %shared
116 shared:
117   %phi = phi i32 [ 1, %left ], [ 0, %right ], [ -1, %right.other ]
118   call void @h(i32 %phi)
119   unreachable
121 ; CHECK: %phi = phi i32 [ 0, %right ], [ -1, %right.other ]
122 ; CHECK: call void @h(i32 %phi)
124 ; CHECK: %phi.for.left = phi i32 [ 1, %left ]
125 ; CHECK: call void @h(i32 %phi.for.left)
127 exit:
128   unreachable
131 declare void @__std_terminate()