1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7-apple-ios -relocation-model=pic -disable-fp-elim -mcpu=cortex-a8 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; rdar://10676853 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker%struct.Dict_node_struct = type { i8*, %struct.Word_file_struct*, %struct.Exp_struct*, %struct.Dict_node_struct*, %struct.Dict_node_struct* } 5*9880d681SAndroid Build Coastguard Worker%struct.Word_file_struct = type { [60 x i8], i32, %struct.Word_file_struct* } 6*9880d681SAndroid Build Coastguard Worker%struct.Exp_struct = type { i8, i8, i8, i8, %union.anon } 7*9880d681SAndroid Build Coastguard Worker%union.anon = type { %struct.E_list_struct* } 8*9880d681SAndroid Build Coastguard Worker%struct.E_list_struct = type { %struct.E_list_struct*, %struct.Exp_struct* } 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@lookup_list = external hidden unnamed_addr global %struct.Dict_node_struct*, align 4 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerdefine hidden fastcc void @rdictionary_lookup(%struct.Dict_node_struct* %dn, i8* nocapture %s) nounwind ssp { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: rdictionary_lookup: 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker br label %tailrecurse 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workertailrecurse: ; preds = %if.then10, %entry 20*9880d681SAndroid Build Coastguard Worker %dn.tr = phi %struct.Dict_node_struct* [ %dn, %entry ], [ %9, %if.then10 ] 21*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq %struct.Dict_node_struct* %dn.tr, null 22*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.end11, label %if.end 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %tailrecurse 25*9880d681SAndroid Build Coastguard Worker %string = getelementptr inbounds %struct.Dict_node_struct, %struct.Dict_node_struct* %dn.tr, i32 0, i32 0 26*9880d681SAndroid Build Coastguard Worker %0 = load i8*, i8** %string, align 4 27*9880d681SAndroid Build Coastguard Worker br label %while.cond.i 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerwhile.cond.i: ; preds = %while.body.i, %if.end 30*9880d681SAndroid Build Coastguard Worker %1 = phi i8* [ %s, %if.end ], [ %incdec.ptr.i, %while.body.i ] 31*9880d681SAndroid Build Coastguard Worker %storemerge.i = phi i8* [ %0, %if.end ], [ %incdec.ptr6.i, %while.body.i ] 32*9880d681SAndroid Build Coastguard Worker %2 = load i8, i8* %1, align 1 33*9880d681SAndroid Build Coastguard Worker %cmp.i = icmp eq i8 %2, 0 34*9880d681SAndroid Build Coastguard Worker %.pre.i = load i8, i8* %storemerge.i, align 1 35*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i, label %lor.lhs.false.i, label %land.end.i 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerland.end.i: ; preds = %while.cond.i 38*9880d681SAndroid Build Coastguard Worker %cmp4.i = icmp eq i8 %2, %.pre.i 39*9880d681SAndroid Build Coastguard Worker br i1 %cmp4.i, label %while.body.i, label %while.end.i 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerwhile.body.i: ; preds = %land.end.i 42*9880d681SAndroid Build Coastguard Worker %incdec.ptr.i = getelementptr inbounds i8, i8* %1, i32 1 43*9880d681SAndroid Build Coastguard Worker %incdec.ptr6.i = getelementptr inbounds i8, i8* %storemerge.i, i32 1 44*9880d681SAndroid Build Coastguard Worker br label %while.cond.i 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerwhile.end.i: ; preds = %land.end.i 47*9880d681SAndroid Build Coastguard Worker %cmp8.i = icmp eq i8 %2, 42 48*9880d681SAndroid Build Coastguard Worker br i1 %cmp8.i, label %if.end3, label %lor.lhs.false.i 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerlor.lhs.false.i: ; preds = %while.end.i, %while.cond.i 51*9880d681SAndroid Build Coastguard Worker %3 = phi i8 [ %2, %while.end.i ], [ 0, %while.cond.i ] 52*9880d681SAndroid Build Coastguard Worker %cmp11.i = icmp eq i8 %.pre.i, 42 53*9880d681SAndroid Build Coastguard Worker br i1 %cmp11.i, label %if.end3, label %dict_match.exit 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdict_match.exit: ; preds = %lor.lhs.false.i 56*9880d681SAndroid Build Coastguard Worker %cmp14.i = icmp eq i8 %3, 46 57*9880d681SAndroid Build Coastguard Worker %conv16.i = sext i8 %3 to i32 58*9880d681SAndroid Build Coastguard Worker %.conv16.i = select i1 %cmp14.i, i32 0, i32 %conv16.i 59*9880d681SAndroid Build Coastguard Worker %cmp18.i = icmp eq i8 %.pre.i, 46 60*9880d681SAndroid Build Coastguard Worker %conv22.i = sext i8 %.pre.i to i32 61*9880d681SAndroid Build Coastguard Worker %cond24.i = select i1 %cmp18.i, i32 0, i32 %conv22.i 62*9880d681SAndroid Build Coastguard Worker %sub.i = sub nsw i32 %.conv16.i, %cond24.i 63*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp sgt i32 %sub.i, -1 64*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %if.end3, label %if.then10 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Workerif.end3: ; preds = %dict_match.exit, %lor.lhs.false.i, %while.end.i 67*9880d681SAndroid Build Coastguard Worker; CHECK: %if.end3 68*9880d681SAndroid Build Coastguard Worker; CHECK: cmp 69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cbnz 70*9880d681SAndroid Build Coastguard Worker %storemerge1.i3 = phi i32 [ %sub.i, %dict_match.exit ], [ 0, %lor.lhs.false.i ], [ 0, %while.end.i ] 71*9880d681SAndroid Build Coastguard Worker %right = getelementptr inbounds %struct.Dict_node_struct, %struct.Dict_node_struct* %dn.tr, i32 0, i32 4 72*9880d681SAndroid Build Coastguard Worker %4 = load %struct.Dict_node_struct*, %struct.Dict_node_struct** %right, align 4 73*9880d681SAndroid Build Coastguard Worker tail call fastcc void @rdictionary_lookup(%struct.Dict_node_struct* %4, i8* %s) 74*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp eq i32 %storemerge1.i3, 0 75*9880d681SAndroid Build Coastguard Worker br i1 %cmp4, label %if.then5, label %if.end8 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerif.then5: ; preds = %if.end3 78*9880d681SAndroid Build Coastguard Worker %call6 = tail call fastcc i8* @xalloc(i32 20) 79*9880d681SAndroid Build Coastguard Worker %5 = bitcast i8* %call6 to %struct.Dict_node_struct* 80*9880d681SAndroid Build Coastguard Worker %6 = bitcast %struct.Dict_node_struct* %dn.tr to i8* 81*9880d681SAndroid Build Coastguard Worker tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %call6, i8* %6, i32 16, i32 4, i1 false) 82*9880d681SAndroid Build Coastguard Worker %7 = load %struct.Dict_node_struct*, %struct.Dict_node_struct** @lookup_list, align 4 83*9880d681SAndroid Build Coastguard Worker %right7 = getelementptr inbounds i8, i8* %call6, i32 16 84*9880d681SAndroid Build Coastguard Worker %8 = bitcast i8* %right7 to %struct.Dict_node_struct** 85*9880d681SAndroid Build Coastguard Worker store %struct.Dict_node_struct* %7, %struct.Dict_node_struct** %8, align 4 86*9880d681SAndroid Build Coastguard Worker store %struct.Dict_node_struct* %5, %struct.Dict_node_struct** @lookup_list, align 4 87*9880d681SAndroid Build Coastguard Worker br label %if.then10 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerif.end8: ; preds = %if.end3 90*9880d681SAndroid Build Coastguard Worker %cmp9 = icmp slt i32 %storemerge1.i3, 1 91*9880d681SAndroid Build Coastguard Worker br i1 %cmp9, label %if.then10, label %if.end11 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerif.then10: ; preds = %if.end8, %if.then5, %dict_match.exit 94*9880d681SAndroid Build Coastguard Worker %left = getelementptr inbounds %struct.Dict_node_struct, %struct.Dict_node_struct* %dn.tr, i32 0, i32 3 95*9880d681SAndroid Build Coastguard Worker %9 = load %struct.Dict_node_struct*, %struct.Dict_node_struct** %left, align 4 96*9880d681SAndroid Build Coastguard Worker br label %tailrecurse 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerif.end11: ; preds = %if.end8, %tailrecurse 99*9880d681SAndroid Build Coastguard Worker ret void 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; Materializable 103*9880d681SAndroid Build Coastguard Workerdeclare hidden fastcc i8* @xalloc(i32) nounwind ssp 104