1*1bf4629fSArthur Eubanks; RUN: opt -ppc-bool-ret-to-int -S -o - < %s | FileCheck %s
2a1c712faSKit Barton
3a1c712faSKit Bartontarget datalayout = "e-m:e-i64:64-n32:64"
4a1c712faSKit Bartontarget triple = "powerpc64le-unknown-linux-gnu"
5a1c712faSKit Barton
6a1c712faSKit Barton; CHECK-LABEL: notBoolRet
7a1c712faSKit Bartondefine signext i32 @notBoolRet() {
8a1c712faSKit Bartonentry:
9a1c712faSKit Barton; CHECK: ret i32 1
10a1c712faSKit Barton  ret i32 1
11a1c712faSKit Barton}
12a1c712faSKit Barton
13a1c712faSKit Barton; CHECK-LABEL: find
14a1c712faSKit Bartondefine zeroext i1 @find(i8** readonly %begin, i8** readnone %end, i1 (i8*)* nocapture %hasProp) {
15a1c712faSKit Bartonentry:
16a1c712faSKit Barton  %cmp.4 = icmp eq i8** %begin, %end
17a1c712faSKit Barton  br i1 %cmp.4, label %cleanup, label %for.body.preheader
18a1c712faSKit Barton
19a1c712faSKit Bartonfor.body.preheader:                               ; preds = %entry
20a1c712faSKit Barton  br label %for.body
21a1c712faSKit Barton
22a1c712faSKit Bartonfor.cond:                                         ; preds = %for.body
23a1c712faSKit Barton  %cmp = icmp eq i8** %incdec.ptr, %end
24a1c712faSKit Barton  br i1 %cmp, label %cleanup.loopexit, label %for.body
25a1c712faSKit Barton
26a1c712faSKit Bartonfor.body:                                         ; preds = %for.body.preheader, %for.cond
27a1c712faSKit Barton  %curr.05 = phi i8** [ %incdec.ptr, %for.cond ], [ %begin, %for.body.preheader ]
28a1c712faSKit Barton  %0 = load i8*, i8** %curr.05, align 8
29a1c712faSKit Barton  %call = tail call zeroext i1 %hasProp(i8* %0)
30a1c712faSKit Barton  %incdec.ptr = getelementptr inbounds i8*, i8** %curr.05, i64 1
31a1c712faSKit Barton  br i1 %call, label %cleanup.loopexit, label %for.cond
32a1c712faSKit Barton
33a1c712faSKit Bartoncleanup.loopexit:                                 ; preds = %for.body, %for.cond
34f31c56dfSGuozhi Wei; CHECK: [[PHI:%.+]] = phi i64 [ 1, %for.body ], [ 0, %for.cond ]
35a1c712faSKit Barton  %cleanup.dest.slot.0.ph = phi i1 [ true, %for.body ], [ false, %for.cond ]
36a1c712faSKit Barton  br label %cleanup
37a1c712faSKit Barton
38a1c712faSKit Bartoncleanup:                                          ; preds = %cleanup.loopexit, %entry
39f31c56dfSGuozhi Wei; CHECK: = phi i64 [ 0, %entry ], [ [[PHI]], %cleanup.loopexit ]
40a1c712faSKit Barton  %cleanup.dest.slot.0 = phi i1 [ false, %entry ], [ %cleanup.dest.slot.0.ph, %cleanup.loopexit ]
41f31c56dfSGuozhi Wei; CHECK: [[REG:%.+]] = trunc i64 {{%.+}} to i1
42a1c712faSKit Barton; CHECK: ret i1 [[REG]]
43a1c712faSKit Barton  ret i1 %cleanup.dest.slot.0
44a1c712faSKit Barton}
45a1c712faSKit Barton
46a1c712faSKit Barton; CHECK-LABEL: retFalse
47a1c712faSKit Bartondefine zeroext i1 @retFalse() {
48a1c712faSKit Bartonentry:
49a1c712faSKit Barton; CHECK: ret i1 false
50a1c712faSKit Barton  ret i1 false
51a1c712faSKit Barton}
52a1c712faSKit Barton
53a1c712faSKit Barton; CHECK-LABEL: retCvtFalse
54a1c712faSKit Bartondefine zeroext i1 @retCvtFalse() {
55a1c712faSKit Bartonentry:
56a1c712faSKit Barton; CHECK: ret i1 false
57a1c712faSKit Barton  ret i1 trunc(i32 0 to i1)
58a1c712faSKit Barton}
59a1c712faSKit Barton
60a1c712faSKit Barton; CHECK-LABEL: find_cont
61a1c712faSKit Bartondefine void @find_cont(i8** readonly %begin, i8** readnone %end, i1 (i8*)* nocapture %hasProp, void (i1)* nocapture %cont) {
62a1c712faSKit Bartonentry:
63a1c712faSKit Barton  %cmp.4 = icmp eq i8** %begin, %end
64a1c712faSKit Barton  br i1 %cmp.4, label %cleanup, label %for.body.preheader
65a1c712faSKit Barton
66a1c712faSKit Bartonfor.body.preheader:                               ; preds = %entry
67a1c712faSKit Barton  br label %for.body
68a1c712faSKit Barton
69a1c712faSKit Bartonfor.cond:                                         ; preds = %for.body
70a1c712faSKit Barton  %cmp = icmp eq i8** %incdec.ptr, %end
71a1c712faSKit Barton  br i1 %cmp, label %cleanup.loopexit, label %for.body
72a1c712faSKit Barton
73a1c712faSKit Bartonfor.body:                                         ; preds = %for.body.preheader, %for.cond
74a1c712faSKit Barton  %curr.05 = phi i8** [ %incdec.ptr, %for.cond ], [ %begin, %for.body.preheader ]
75a1c712faSKit Barton  %0 = load i8*, i8** %curr.05, align 8
76a1c712faSKit Barton  %call = tail call zeroext i1 %hasProp(i8* %0)
77a1c712faSKit Barton  %incdec.ptr = getelementptr inbounds i8*, i8** %curr.05, i64 1
78a1c712faSKit Barton  br i1 %call, label %cleanup.loopexit, label %for.cond
79a1c712faSKit Barton
80a1c712faSKit Bartoncleanup.loopexit:                                 ; preds = %for.body, %for.cond
81f31c56dfSGuozhi Wei; CHECK: [[PHI:%.+]] = phi i64 [ 1, %for.body ], [ 0, %for.cond ]
82a1c712faSKit Barton  %cleanup.dest.slot.0.ph = phi i1 [ true, %for.body ], [ false, %for.cond ]
83a1c712faSKit Barton  br label %cleanup
84a1c712faSKit Barton
85a1c712faSKit Bartoncleanup:                                          ; preds = %cleanup.loopexit, %entry
86f31c56dfSGuozhi Wei; CHECK: = phi i64 [ 0, %entry ], [ [[PHI]], %cleanup.loopexit ]
87a1c712faSKit Barton  %cleanup.dest.slot.0 = phi i1 [ false, %entry ], [ %cleanup.dest.slot.0.ph, %cleanup.loopexit ]
88f31c56dfSGuozhi Wei; CHECK: [[REG:%.+]] = trunc i64 {{%.+}} to i1
89a1c712faSKit Barton; CHECK: call void %cont(i1 [[REG]]
90a1c712faSKit Barton  tail call void %cont(i1 %cleanup.dest.slot.0)
91a1c712faSKit Barton  ret void
92a1c712faSKit Barton}
93a1c712faSKit Barton
94a1c712faSKit Barton; CHECK-LABEL: find_cont_ret
95a1c712faSKit Bartondefine zeroext i1 @find_cont_ret(i8** readonly %begin, i8** readnone %end, i1 (i8*)* nocapture %hasProp, void (i1)* nocapture %cont) {
96a1c712faSKit Bartonentry:
97a1c712faSKit Barton  %cmp.4 = icmp eq i8** %begin, %end
98a1c712faSKit Barton  br i1 %cmp.4, label %cleanup, label %for.body.preheader
99a1c712faSKit Barton
100a1c712faSKit Bartonfor.body.preheader:                               ; preds = %entry
101a1c712faSKit Barton  br label %for.body
102a1c712faSKit Barton
103a1c712faSKit Bartonfor.cond:                                         ; preds = %for.body
104a1c712faSKit Barton  %cmp = icmp eq i8** %incdec.ptr, %end
105a1c712faSKit Barton  br i1 %cmp, label %cleanup.loopexit, label %for.body
106a1c712faSKit Barton
107a1c712faSKit Bartonfor.body:                                         ; preds = %for.body.preheader, %for.cond
108a1c712faSKit Barton  %curr.05 = phi i8** [ %incdec.ptr, %for.cond ], [ %begin, %for.body.preheader ]
109a1c712faSKit Barton  %0 = load i8*, i8** %curr.05, align 8
110a1c712faSKit Barton  %call = tail call zeroext i1 %hasProp(i8* %0)
111a1c712faSKit Barton  %incdec.ptr = getelementptr inbounds i8*, i8** %curr.05, i64 1
112a1c712faSKit Barton  br i1 %call, label %cleanup.loopexit, label %for.cond
113a1c712faSKit Barton
114a1c712faSKit Bartoncleanup.loopexit:                                 ; preds = %for.body, %for.cond
115f31c56dfSGuozhi Wei; CHECK: [[PHI:%.+]] = phi i64 [ 1, %for.body ], [ 0, %for.cond ]
116a1c712faSKit Barton  %cleanup.dest.slot.0.ph = phi i1 [ true, %for.body ], [ false, %for.cond ]
117a1c712faSKit Barton  br label %cleanup
118a1c712faSKit Barton
119a1c712faSKit Bartoncleanup:                                          ; preds = %cleanup.loopexit, %entry
120f31c56dfSGuozhi Wei; CHECK: = phi i64 [ 0, %entry ], [ [[PHI]], %cleanup.loopexit ]
121a1c712faSKit Barton  %cleanup.dest.slot.0 = phi i1 [ false, %entry ], [ %cleanup.dest.slot.0.ph, %cleanup.loopexit ]
122f31c56dfSGuozhi Wei; CHECK: [[REG:%.+]] = trunc i64 {{%.+}} to i1
123a1c712faSKit Barton; CHECK: call void %cont(i1 [[REG]]
124a1c712faSKit Barton  tail call void %cont(i1 %cleanup.dest.slot.0)
125f31c56dfSGuozhi Wei; CHECK: [[REG:%.+]] = trunc i64 {{%.+}} to i1
126a1c712faSKit Barton; CHECK: ret i1 [[REG]]
127a1c712faSKit Barton  ret i1 %cleanup.dest.slot.0
128a1c712faSKit Barton}
129a1c712faSKit Barton
130a1c712faSKit Barton; CHECK-LABEL: arg_operand
131a1c712faSKit Bartondefine zeroext i1 @arg_operand(i1 %operand) {
132a1c712faSKit Bartonentry:
133a1c712faSKit Barton  br i1 %operand, label %foo, label %cleanup
134a1c712faSKit Barton
135a1c712faSKit Bartonfoo:
136a1c712faSKit Barton  br label %cleanup
137a1c712faSKit Barton
138a1c712faSKit Bartoncleanup:
139f31c56dfSGuozhi Wei; CHECK: [[REG:%.+]] = trunc i64 {{%.+}} to i1
140a1c712faSKit Barton; CHECK: ret i1 [[REG]]
141a1c712faSKit Barton  %result = phi i1 [ false, %foo ], [ %operand, %entry ]
142a1c712faSKit Barton  ret i1 %result
143a1c712faSKit Barton}
144a1c712faSKit Barton
145a1c712faSKit Barton; CHECK-LABEL: bad_use
146a1c712faSKit Bartondefine zeroext i1 @bad_use(i1 %operand) {
147a1c712faSKit Bartonentry:
148a1c712faSKit Barton  br i1 %operand, label %foo, label %cleanup
149a1c712faSKit Barton
150a1c712faSKit Bartonfoo:
151a1c712faSKit Barton  br label %cleanup
152a1c712faSKit Barton
153a1c712faSKit Bartoncleanup:
154a1c712faSKit Barton; CHECK: [[REG:%.+]] = phi i1
155a1c712faSKit Barton; CHECK: ret i1 [[REG]]
156a1c712faSKit Barton  %result = phi i1 [ false, %foo], [ true, %entry ]
157a1c712faSKit Barton  %0 = icmp eq i1 %result, %operand
158a1c712faSKit Barton  ret i1 %result
159a1c712faSKit Barton}
160a1c712faSKit Barton
161a1c712faSKit Barton; CHECK-LABEL: bad_use_closure
162a1c712faSKit Bartondefine zeroext i1 @bad_use_closure(i1 %operand) {
163a1c712faSKit Bartonentry:
164a1c712faSKit Barton  br i1 %operand, label %foo, label %cleanup
165a1c712faSKit Barton
166a1c712faSKit Bartonfoo:
167a1c712faSKit Barton  %bar = phi i1 [ false, %entry ]
168a1c712faSKit Barton  %0 = icmp eq i1 %bar, %operand
169a1c712faSKit Barton  br label %cleanup
170a1c712faSKit Barton
171a1c712faSKit Bartoncleanup:
172a1c712faSKit Barton; CHECK: [[REG:%.+]] = phi i1 [ true
173a1c712faSKit Barton; CHECK: ret i1 [[REG]]
174a1c712faSKit Barton  %result = phi i1 [ true, %entry ], [ %bar, %foo]
175a1c712faSKit Barton  ret i1 %result
176a1c712faSKit Barton}
177a1c712faSKit Barton
178a1c712faSKit Barton; CHECK-LABEL: arg_test
179a1c712faSKit Bartondefine zeroext i1 @arg_test(i1 %operand) {
180a1c712faSKit Bartonentry:
181a1c712faSKit Barton  br i1 %operand, label %foo, label %cleanup
182a1c712faSKit Barton
183a1c712faSKit Bartonfoo:
184a1c712faSKit Barton  %bar = phi i1 [ false, %entry ]
185a1c712faSKit Barton  br label %cleanup
186a1c712faSKit Barton
187a1c712faSKit Barton; CHECK-LABEL: cleanup
188a1c712faSKit Bartoncleanup:
189f31c56dfSGuozhi Wei; CHECK: [[REG:%.+]] = trunc i64 {{%.+}} to i1
190a1c712faSKit Barton; CHECK: ret i1 [[REG]]
191a1c712faSKit Barton  %result = phi i1 [ %bar, %foo], [ %operand, %entry ]
192a1c712faSKit Barton  ret i1 %result
193a1c712faSKit Barton}
194a1c712faSKit Barton
195a1c712faSKit Bartondeclare zeroext i1 @return_i1()
196a1c712faSKit Barton
197a1c712faSKit Barton; CHECK-LABEL: call_test
198a1c712faSKit Bartondefine zeroext i1 @call_test() {
199a1c712faSKit Barton; CHECK: [[REG:%.+]] = call i1
200a1c712faSKit Barton  %result = call i1 @return_i1()
201f31c56dfSGuozhi Wei; CHECK: [[REG:%.+]] = zext i1 {{%.+}} to i64
202f31c56dfSGuozhi Wei; CHECK: [[REG:%.+]] = trunc i64 {{%.+}} to i1
203a1c712faSKit Barton; CHECK: ret i1 [[REG]]
204a1c712faSKit Barton  ret i1 %result
205a1c712faSKit Barton}
206