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