[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / branchfolding-catchpads.ll
blob013219e2d366f0c2e23bfa82dcef428a2a3d3f08
1 ; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s
3 declare i32 @__CxxFrameHandler3(...)
5 declare void @throw()
6 declare i16 @f()
8 define i16 @test1(i16 %a, i8* %b) personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
9 entry:
10   %cmp = icmp eq i16 %a, 10
11   br i1 %cmp, label %if.then, label %if.else
13 if.then:
14   %call1 = invoke i16 @f()
15           to label %cleanup unwind label %catch.dispatch
17 if.else:
18   %call2 = invoke i16 @f()
19           to label %cleanup unwind label %catch.dispatch
21 catch.dispatch:
22   %cs = catchswitch within none [ label %catch, label %catch.2 ] unwind to caller
24 catch:
25   catchpad within %cs [i8* null, i32 8, i8* null]
26   call void @throw() noreturn
27   br label %unreachable
29 catch.2:
30   catchpad within %cs [i8* null, i32 64, i8* null]
31   store i8 1, i8* %b
32   call void @throw() noreturn
33   br label %unreachable
35 cleanup:
36   %retval = phi i16 [ %call1, %if.then ], [ %call2, %if.else ]
37   ret i16 %retval
39 unreachable:
40   unreachable
43 ; This test verifies the case where two funclet blocks meet the old criteria
44 ; to be placed at the end.  The order of the blocks is not important for the
45 ; purposes of this test.  The failure mode is an infinite loop during
46 ; compilation.
48 ; CHECK-LABEL: .def     test1;
50 define i16 @test2(i16 %a, i8* %b) personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
51 entry:
52   %cmp = icmp eq i16 %a, 10
53   br i1 %cmp, label %if.then, label %if.else
55 if.then:
56   %call1 = invoke i16 @f()
57           to label %cleanup unwind label %catch.dispatch
59 if.else:
60   %call2 = invoke i16 @f()
61           to label %cleanup unwind label %catch.dispatch
63 catch.dispatch:
64   %cs = catchswitch within none [ label %catch, label %catch.2, label %catch.3 ] unwind to caller
66 catch:
67   catchpad within %cs [i8* null, i32 8, i8* null]
68   call void @throw() noreturn
69   br label %unreachable
71 catch.2:
72   %c2 = catchpad within %cs [i8* null, i32 32, i8* null]
73   store i8 1, i8* %b
74   catchret from %c2 to label %cleanup
76 catch.3:
77   %c3 = catchpad within %cs [i8* null, i32 64, i8* null]
78   store i8 2, i8* %b
79   catchret from %c3 to label %cleanup
81 cleanup:
82   %retval = phi i16 [ %call1, %if.then ], [ %call2, %if.else ], [ -1, %catch.2 ], [ -1, %catch.3 ]
83   ret i16 %retval
85 unreachable:
86   unreachable
89 ; This test verifies the case where three funclet blocks all meet the old
90 ; criteria to be placed at the end.  The order of the blocks is not important
91 ; for the purposes of this test.  The failure mode is an infinite loop during
92 ; compilation.
94 ; CHECK-LABEL: .def     test2;
96 declare void @g()
98 define void @test3() optsize personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
99 entry:
100   switch i32 undef, label %if.end57 [
101     i32 64, label %sw.bb
102     i32 128, label %sw.epilog
103     i32 256, label %if.then56
104     i32 1024, label %sw.bb
105     i32 4096, label %sw.bb33
106     i32 16, label %sw.epilog
107     i32 8, label %sw.epilog
108     i32 32, label %sw.bb44
109   ]
111 sw.bb:
112   unreachable
114 sw.bb33:
115   br i1 undef, label %if.end57, label %while.cond.i163.preheader
117 while.cond.i163.preheader:
118   unreachable
120 sw.bb44:
121   %temp0 = load void ()*, void ()** undef
122   invoke void %temp0()
123           to label %if.end57 unwind label %catch.dispatch
125 sw.epilog:
126   %temp1 = load i8*, i8** undef
127   br label %if.end57
129 catch.dispatch:
130   %cs = catchswitch within none [label %catch1, label %catch2, label %catch3] unwind to caller
132 catch1:
133   %c1 = catchpad within %cs [i8* null, i32 8, i8* null]
134   unreachable
136 catch2:
137   %c2 = catchpad within %cs [i8* null, i32 32, i8* null]
138   unreachable
140 catch3:
141   %c3 = catchpad within %cs [i8* null, i32 64, i8* null]
142   unreachable
144 if.then56:
145   call void @g()
146   br label %if.end57
148 if.end57:
149   ret void
152 ; This test exercises a complex case that produced an infinite loop during
153 ; compilation when the two cases above did not. The multiple targets from the
154 ; entry switch are not actually fundamental to the failure, but they are
155 ; necessary to suppress various control flow optimizations that would prevent
156 ; the conditions that lead to the failure.
158 ; CHECK-LABEL: .def     test3;