1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S < %s -indvars | opt -analyze -iv-users | grep "%cmp = icmp slt i32" | grep "= {%\.ph,+,1}<%for.cond>" 2*9880d681SAndroid Build Coastguard Worker; PR8079 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Provide legal integer types. 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "n8:16:32:64" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; LoopSimplify should invalidate indvars when splitting out the 8*9880d681SAndroid Build Coastguard Worker; inner loop. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker@maxStat = external global i32 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdefine i32 @test() nounwind { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker br label %for.cond 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Workerfor.cond: ; preds = %if.then5, %if.end, %entry 17*9880d681SAndroid Build Coastguard Worker %cuts.1 = phi i32 [ 0, %entry ], [ %inc, %if.then5 ], [ %cuts.1, %if.end ] 18*9880d681SAndroid Build Coastguard Worker %0 = phi i32 [ 0, %entry ], [ %add, %if.end ], [ %add, %if.then5 ] 19*9880d681SAndroid Build Coastguard Worker %add = add i32 %0, 1 20*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %0, 1 21*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* @maxStat, align 4 22*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.cond14.preheader 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerfor.cond14.preheader: ; preds = %for.cond 25*9880d681SAndroid Build Coastguard Worker %cmp1726 = icmp sgt i32 %tmp1, 0 26*9880d681SAndroid Build Coastguard Worker br i1 %cmp1726, label %for.body18, label %return 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.cond 29*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp sgt i32 %tmp1, 100 30*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %return, label %if.end 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %for.body 33*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp sgt i32 %tmp1, -1 34*9880d681SAndroid Build Coastguard Worker br i1 %cmp4, label %if.then5, label %for.cond 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerif.then5: ; preds = %if.end 37*9880d681SAndroid Build Coastguard Worker call void @foo() nounwind 38*9880d681SAndroid Build Coastguard Worker %inc = add i32 %cuts.1, 1 39*9880d681SAndroid Build Coastguard Worker br label %for.cond 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerfor.body18: ; preds = %for.body18, %for.cond14.preheader 42*9880d681SAndroid Build Coastguard Worker %i13.027 = phi i32 [ %1, %for.body18 ], [ 0, %for.cond14.preheader ] 43*9880d681SAndroid Build Coastguard Worker call void @foo() nounwind 44*9880d681SAndroid Build Coastguard Worker %1 = add nsw i32 %i13.027, 1 45*9880d681SAndroid Build Coastguard Worker %tmp16 = load i32, i32* @maxStat, align 4 46*9880d681SAndroid Build Coastguard Worker %cmp17 = icmp slt i32 %1, %tmp16 47*9880d681SAndroid Build Coastguard Worker br i1 %cmp17, label %for.body18, label %return 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %for.body18, %for.body, %for.cond14.preheader 50*9880d681SAndroid Build Coastguard Worker ret i32 0 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdeclare void @foo() nounwind 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Notify SCEV when removing an ExitingBlock. 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @mergeExit( 57*9880d681SAndroid Build Coastguard Worker; CHECK: while.cond191: 58*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %while.body197 59*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: land.rhs: 60*9880d681SAndroid Build Coastguard Worker; CHECK: ret 61*9880d681SAndroid Build Coastguard Workerdefine void @mergeExit(i32 %MapAttrCount) nounwind uwtable ssp { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then124, label %if.end126 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerif.then124: ; preds = %entry 66*9880d681SAndroid Build Coastguard Worker unreachable 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerif.end126: ; preds = %entry 69*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.body.lr.ph, label %if.end591 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerwhile.body.lr.ph: ; preds = %if.end126 72*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.end140, label %if.then137 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerif.then137: ; preds = %while.body.lr.ph 75*9880d681SAndroid Build Coastguard Worker unreachable 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerif.end140: ; preds = %while.body.lr.ph 78*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.cond191.outer, label %if.then148 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerif.then148: ; preds = %if.end140 81*9880d681SAndroid Build Coastguard Worker unreachable 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerwhile.cond191.outer: ; preds = %if.then205, %if.end140 84*9880d681SAndroid Build Coastguard Worker br label %while.cond191 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Workerwhile.cond191: ; preds = %while.body197, %while.cond191.outer 87*9880d681SAndroid Build Coastguard Worker %CppIndex.0 = phi i32 [ %inc, %while.body197 ], [ undef, %while.cond191.outer ] 88*9880d681SAndroid Build Coastguard Worker br i1 undef, label %land.rhs, label %if.then216 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerland.rhs: ; preds = %while.cond191 91*9880d681SAndroid Build Coastguard Worker %inc = add i32 %CppIndex.0, 1 92*9880d681SAndroid Build Coastguard Worker %cmp196 = icmp ult i32 %inc, %MapAttrCount 93*9880d681SAndroid Build Coastguard Worker br i1 %cmp196, label %while.body197, label %if.then216 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerwhile.body197: ; preds = %land.rhs 96*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then205, label %while.cond191 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerif.then205: ; preds = %while.body197 99*9880d681SAndroid Build Coastguard Worker br label %while.cond191.outer 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Workerif.then216: ; preds = %land.rhs, %while.cond191 102*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.else, label %if.then221 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerif.then221: ; preds = %if.then216 105*9880d681SAndroid Build Coastguard Worker unreachable 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %if.then216 108*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then266, label %if.end340 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Workerif.then266: ; preds = %if.else 111*9880d681SAndroid Build Coastguard Worker switch i32 undef, label %if.else329 [ 112*9880d681SAndroid Build Coastguard Worker i32 17, label %if.then285 113*9880d681SAndroid Build Coastguard Worker i32 19, label %if.then285 114*9880d681SAndroid Build Coastguard Worker i32 18, label %if.then285 115*9880d681SAndroid Build Coastguard Worker i32 15, label %if.then285 116*9880d681SAndroid Build Coastguard Worker ] 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerif.then285: ; preds = %if.then266, %if.then266, %if.then266, %if.then266 119*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.then317, label %if.else324 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerif.then317: ; preds = %if.then285 122*9880d681SAndroid Build Coastguard Worker br label %if.end340 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerif.else324: ; preds = %if.then285 125*9880d681SAndroid Build Coastguard Worker unreachable 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerif.else329: ; preds = %if.then266 128*9880d681SAndroid Build Coastguard Worker unreachable 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerif.end340: ; preds = %if.then317, %if.else 131*9880d681SAndroid Build Coastguard Worker unreachable 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerif.end591: ; preds = %if.end126 134*9880d681SAndroid Build Coastguard Worker br i1 undef, label %cond.end, label %cond.false 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workercond.false: ; preds = %if.end591 137*9880d681SAndroid Build Coastguard Worker unreachable 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workercond.end: ; preds = %if.end591 140*9880d681SAndroid Build Coastguard Worker ret void 141*9880d681SAndroid Build Coastguard Worker} 142