1; RUN: llc < %s
2
3define i32 @test1(i32 %x) nounwind uwtable ssp {
4entry:
5  %retval = alloca i32, align 4
6  %x.addr = alloca i32, align 4
7  store i32 %x, i32* %x.addr, align 4
8  %tmp = load i32, i32* %x.addr, align 4
9  %cmp = icmp sgt i32 %tmp, 1
10  %conv = zext i1 %cmp to i32
11  %conv1 = sext i32 %conv to i64
12  %expval = call i64 @llvm.expect.i64(i64 %conv1, i64 1)
13  %tobool = icmp ne i64 %expval, 0
14  br i1 %tobool, label %if.then, label %if.end
15
16if.then:                                          ; preds = %entry
17  %call = call i32 (...) @f()
18  store i32 %call, i32* %retval
19  br label %return
20
21if.end:                                           ; preds = %entry
22  store i32 1, i32* %retval
23  br label %return
24
25return:                                           ; preds = %if.end, %if.then
26  %0 = load i32, i32* %retval
27  ret i32 %0
28}
29
30declare i64 @llvm.expect.i64(i64, i64) nounwind readnone
31
32declare i32 @f(...)
33
34define i32 @test2(i32 %x) nounwind uwtable ssp {
35entry:
36  %retval = alloca i32, align 4
37  %x.addr = alloca i32, align 4
38  store i32 %x, i32* %x.addr, align 4
39  %tmp = load i32, i32* %x.addr, align 4
40  %conv = sext i32 %tmp to i64
41  %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
42  %tobool = icmp ne i64 %expval, 0
43  br i1 %tobool, label %if.then, label %if.end
44
45if.then:                                          ; preds = %entry
46  %call = call i32 (...) @f()
47  store i32 %call, i32* %retval
48  br label %return
49
50if.end:                                           ; preds = %entry
51  store i32 1, i32* %retval
52  br label %return
53
54return:                                           ; preds = %if.end, %if.then
55  %0 = load i32, i32* %retval
56  ret i32 %0
57}
58
59define i32 @test3(i32 %x) nounwind uwtable ssp {
60entry:
61  %retval = alloca i32, align 4
62  %x.addr = alloca i32, align 4
63  store i32 %x, i32* %x.addr, align 4
64  %tmp = load i32, i32* %x.addr, align 4
65  %tobool = icmp ne i32 %tmp, 0
66  %lnot = xor i1 %tobool, true
67  %lnot.ext = zext i1 %lnot to i32
68  %conv = sext i32 %lnot.ext to i64
69  %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
70  %tobool1 = icmp ne i64 %expval, 0
71  br i1 %tobool1, label %if.then, label %if.end
72
73if.then:                                          ; preds = %entry
74  %call = call i32 (...) @f()
75  store i32 %call, i32* %retval
76  br label %return
77
78if.end:                                           ; preds = %entry
79  store i32 1, i32* %retval
80  br label %return
81
82return:                                           ; preds = %if.end, %if.then
83  %0 = load i32, i32* %retval
84  ret i32 %0
85}
86
87define i32 @test4(i32 %x) nounwind uwtable ssp {
88entry:
89  %retval = alloca i32, align 4
90  %x.addr = alloca i32, align 4
91  store i32 %x, i32* %x.addr, align 4
92  %tmp = load i32, i32* %x.addr, align 4
93  %tobool = icmp ne i32 %tmp, 0
94  %lnot = xor i1 %tobool, true
95  %lnot1 = xor i1 %lnot, true
96  %lnot.ext = zext i1 %lnot1 to i32
97  %conv = sext i32 %lnot.ext to i64
98  %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
99  %tobool2 = icmp ne i64 %expval, 0
100  br i1 %tobool2, label %if.then, label %if.end
101
102if.then:                                          ; preds = %entry
103  %call = call i32 (...) @f()
104  store i32 %call, i32* %retval
105  br label %return
106
107if.end:                                           ; preds = %entry
108  store i32 1, i32* %retval
109  br label %return
110
111return:                                           ; preds = %if.end, %if.then
112  %0 = load i32, i32* %retval
113  ret i32 %0
114}
115
116define i32 @test5(i32 %x) nounwind uwtable ssp {
117entry:
118  %retval = alloca i32, align 4
119  %x.addr = alloca i32, align 4
120  store i32 %x, i32* %x.addr, align 4
121  %tmp = load i32, i32* %x.addr, align 4
122  %cmp = icmp slt i32 %tmp, 0
123  %conv = zext i1 %cmp to i32
124  %conv1 = sext i32 %conv to i64
125  %expval = call i64 @llvm.expect.i64(i64 %conv1, i64 0)
126  %tobool = icmp ne i64 %expval, 0
127  br i1 %tobool, label %if.then, label %if.end
128
129if.then:                                          ; preds = %entry
130  %call = call i32 (...) @f()
131  store i32 %call, i32* %retval
132  br label %return
133
134if.end:                                           ; preds = %entry
135  store i32 1, i32* %retval
136  br label %return
137
138return:                                           ; preds = %if.end, %if.then
139  %0 = load i32, i32* %retval
140  ret i32 %0
141}
142
143define i32 @test6(i32 %x) nounwind uwtable ssp {
144entry:
145  %retval = alloca i32, align 4
146  %x.addr = alloca i32, align 4
147  store i32 %x, i32* %x.addr, align 4
148  %tmp = load i32, i32* %x.addr, align 4
149  %conv = sext i32 %tmp to i64
150  %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
151  switch i64 %expval, label %sw.epilog [
152    i64 1, label %sw.bb
153    i64 2, label %sw.bb
154  ]
155
156sw.bb:                                            ; preds = %entry, %entry
157  store i32 0, i32* %retval
158  br label %return
159
160sw.epilog:                                        ; preds = %entry
161  store i32 1, i32* %retval
162  br label %return
163
164return:                                           ; preds = %sw.epilog, %sw.bb
165  %0 = load i32, i32* %retval
166  ret i32 %0
167}
168
169define i32 @test7(i32 %x) nounwind uwtable ssp {
170entry:
171  %retval = alloca i32, align 4
172  %x.addr = alloca i32, align 4
173  store i32 %x, i32* %x.addr, align 4
174  %tmp = load i32, i32* %x.addr, align 4
175  %conv = sext i32 %tmp to i64
176  %expval = call i64 @llvm.expect.i64(i64 %conv, i64 1)
177  switch i64 %expval, label %sw.epilog [
178    i64 2, label %sw.bb
179    i64 3, label %sw.bb
180  ]
181
182sw.bb:                                            ; preds = %entry, %entry
183  %tmp1 = load i32, i32* %x.addr, align 4
184  store i32 %tmp1, i32* %retval
185  br label %return
186
187sw.epilog:                                        ; preds = %entry
188  store i32 0, i32* %retval
189  br label %return
190
191return:                                           ; preds = %sw.epilog, %sw.bb
192  %0 = load i32, i32* %retval
193  ret i32 %0
194}
195
196define i32 @test8(i32 %x) nounwind uwtable ssp {
197entry:
198  %retval = alloca i32, align 4
199  %x.addr = alloca i32, align 4
200  store i32 %x, i32* %x.addr, align 4
201  %tmp = load i32, i32* %x.addr, align 4
202  %cmp = icmp sgt i32 %tmp, 1
203  %conv = zext i1 %cmp to i32
204  %expval = call i32 @llvm.expect.i32(i32 %conv, i32 1)
205  %tobool = icmp ne i32 %expval, 0
206  br i1 %tobool, label %if.then, label %if.end
207
208if.then:                                          ; preds = %entry
209  %call = call i32 (...) @f()
210  store i32 %call, i32* %retval
211  br label %return
212
213if.end:                                           ; preds = %entry
214  store i32 1, i32* %retval
215  br label %return
216
217return:                                           ; preds = %if.end, %if.then
218  %0 = load i32, i32* %retval
219  ret i32 %0
220}
221
222declare i32 @llvm.expect.i32(i32, i32) nounwind readnone
223
224