fix the regression I introduced in r159385 (it's necessary to update PHI nodes in...
[oota-llvm.git] / test / Transforms / SimplifyCFG / invoke.ll
1 ; RUN: opt < %s -simplifycfg -S | FileCheck %s
2 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
3
4 declare i32 @__gxx_personality_v0(...)
5 declare void @__cxa_call_unexpected(i8*)
6 declare i32 @read_only() nounwind readonly
7 declare i32 @nounwind_fn() nounwind
8 declare i32 @fn()
9
10
11 ; CHECK: @f1
12 define i8* @f1() nounwind uwtable ssp {
13 entry:
14 ; CHECK: call void @llvm.trap()
15 ; CHECK: unreachable
16   %call = invoke noalias i8* undef()
17           to label %invoke.cont unwind label %lpad
18
19 invoke.cont:
20   ret i8* %call
21
22 lpad:
23   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
24           filter [0 x i8*] zeroinitializer
25   %1 = extractvalue { i8*, i32 } %0, 0
26   tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
27   unreachable
28 }
29
30 ; CHECK: @f2
31 define i8* @f2() nounwind uwtable ssp {
32 entry:
33 ; CHECK: call void @llvm.trap()
34 ; CHECK: unreachable
35   %call = invoke noalias i8* null()
36           to label %invoke.cont unwind label %lpad
37
38 invoke.cont:
39   ret i8* %call
40
41 lpad:
42   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
43           filter [0 x i8*] zeroinitializer
44   %1 = extractvalue { i8*, i32 } %0, 0
45   tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
46   unreachable
47 }
48
49 ; CHECK: @f3
50 define i32 @f3() nounwind uwtable ssp {
51 ; CHECK-NEXT: entry
52 entry:
53 ; CHECK-NEXT: ret i32 3
54   %call = invoke i32 @read_only()
55           to label %invoke.cont unwind label %lpad
56
57 invoke.cont:
58   ret i32 3
59
60 lpad:
61   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
62           filter [0 x i8*] zeroinitializer
63   %1 = extractvalue { i8*, i32 } %0, 0
64   tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
65   unreachable
66 }
67
68 ; CHECK: @f4
69 define i32 @f4() nounwind uwtable ssp {
70 ; CHECK-NEXT: entry
71 entry:
72 ; CHECK-NEXT: call i32 @read_only()
73   %call = invoke i32 @read_only()
74           to label %invoke.cont unwind label %lpad
75
76 invoke.cont:
77 ; CHECK-NEXT: ret i32 %call
78   ret i32 %call
79
80 lpad:
81   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
82           filter [0 x i8*] zeroinitializer
83   %1 = extractvalue { i8*, i32 } %0, 0
84   tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
85   unreachable
86 }
87
88 ; CHECK: @f5
89 define i32 @f5(i1 %cond, i8* %a, i8* %b) {
90 entry:
91   br i1 %cond, label %x, label %y
92
93 x:
94 ; CHECK: invoke i32 @fn()
95   %call = invoke i32 @fn()
96           to label %cont unwind label %lpad
97
98 y:
99 ; CHECK: call i32 @nounwind_fn()
100   %call2 = invoke i32 @nounwind_fn()
101            to label %cont unwind label %lpad
102
103 cont:
104 ; CHECK: phi i32
105 ; CHECK: ret i32 %phi
106   %phi = phi i32 [%call, %x], [%call2, %y]
107   ret i32 %phi
108
109 lpad:
110 ; CHECK-NOT: phi
111   %phi2 = phi i8* [%a, %x], [%b, %y]
112   %0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
113           filter [0 x i8*] zeroinitializer
114 ; CHECK: __cxa_call_unexpected(i8* %a)
115   tail call void @__cxa_call_unexpected(i8* %phi2) noreturn nounwind
116   unreachable
117 }