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