1*9880d681SAndroid Build Coastguard Worker; RUN: opt %s -always-inline | opt -analyze -scalar-evolution 2*9880d681SAndroid Build Coastguard Worker; There was optimization bug in ScalarEvolution, that causes too long 3*9880d681SAndroid Build Coastguard Worker; compute time and stack overflow crash. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare void @body(i32) 6*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.assume(i1) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine available_externally void @assume1(i64 %i.ext, i64 %a) alwaysinline { 9*9880d681SAndroid Build Coastguard Worker %cmp0 = icmp ne i64 %i.ext, %a 10*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp0) 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker %a1 = add i64 %a, 1 13*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ne i64 %i.ext, %a1 14*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp1) 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker %a2 = add i64 %a1, 1 17*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ne i64 %i.ext, %a2 18*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp2) 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker %a3 = add i64 %a2, 1 21*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ne i64 %i.ext, %a3 22*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp3) 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker %a4 = add i64 %a3, 1 25*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp ne i64 %i.ext, %a4 26*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %cmp4) 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker ret void 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Workerdefine available_externally void @assume2(i64 %i.ext, i64 %a) alwaysinline { 32*9880d681SAndroid Build Coastguard Worker call void @assume1(i64 %i.ext, i64 %a) 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker %a1 = add i64 %a, 5 35*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ne i64 %i.ext, %a1 36*9880d681SAndroid Build Coastguard Worker call void @assume1(i64 %i.ext, i64 %a1) 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker %a2 = add i64 %a1, 5 39*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ne i64 %i.ext, %a2 40*9880d681SAndroid Build Coastguard Worker call void @assume1(i64 %i.ext, i64 %a2) 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker %a3 = add i64 %a2, 5 43*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ne i64 %i.ext, %a3 44*9880d681SAndroid Build Coastguard Worker call void @assume1(i64 %i.ext, i64 %a3) 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker %a4 = add i64 %a3, 5 47*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp ne i64 %i.ext, %a4 48*9880d681SAndroid Build Coastguard Worker call void @assume1(i64 %i.ext, i64 %a4) 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker ret void 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine available_externally void @assume3(i64 %i.ext, i64 %a) alwaysinline { 54*9880d681SAndroid Build Coastguard Worker call void @assume2(i64 %i.ext, i64 %a) 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker %a1 = add i64 %a, 25 57*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ne i64 %i.ext, %a1 58*9880d681SAndroid Build Coastguard Worker call void @assume2(i64 %i.ext, i64 %a1) 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker %a2 = add i64 %a1, 25 61*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ne i64 %i.ext, %a2 62*9880d681SAndroid Build Coastguard Worker call void @assume2(i64 %i.ext, i64 %a2) 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker %a3 = add i64 %a2, 25 65*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ne i64 %i.ext, %a3 66*9880d681SAndroid Build Coastguard Worker call void @assume2(i64 %i.ext, i64 %a3) 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker %a4 = add i64 %a3, 25 69*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp ne i64 %i.ext, %a4 70*9880d681SAndroid Build Coastguard Worker call void @assume2(i64 %i.ext, i64 %a4) 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker ret void 73*9880d681SAndroid Build Coastguard Worker} 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine available_externally void @assume4(i64 %i.ext, i64 %a) alwaysinline { 76*9880d681SAndroid Build Coastguard Worker call void @assume3(i64 %i.ext, i64 %a) 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker %a1 = add i64 %a, 125 79*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ne i64 %i.ext, %a1 80*9880d681SAndroid Build Coastguard Worker call void @assume3(i64 %i.ext, i64 %a1) 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker %a2 = add i64 %a1, 125 83*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ne i64 %i.ext, %a2 84*9880d681SAndroid Build Coastguard Worker call void @assume3(i64 %i.ext, i64 %a2) 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker %a3 = add i64 %a2, 125 87*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ne i64 %i.ext, %a3 88*9880d681SAndroid Build Coastguard Worker call void @assume3(i64 %i.ext, i64 %a3) 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker %a4 = add i64 %a3, 125 91*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp ne i64 %i.ext, %a4 92*9880d681SAndroid Build Coastguard Worker call void @assume3(i64 %i.ext, i64 %a4) 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker ret void 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine available_externally void @assume5(i64 %i.ext, i64 %a) alwaysinline { 98*9880d681SAndroid Build Coastguard Worker call void @assume4(i64 %i.ext, i64 %a) 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker %a1 = add i64 %a, 625 101*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ne i64 %i.ext, %a1 102*9880d681SAndroid Build Coastguard Worker call void @assume4(i64 %i.ext, i64 %a1) 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker %a2 = add i64 %a1, 625 105*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp ne i64 %i.ext, %a2 106*9880d681SAndroid Build Coastguard Worker call void @assume4(i64 %i.ext, i64 %a2) 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker %a3 = add i64 %a2, 625 109*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp ne i64 %i.ext, %a3 110*9880d681SAndroid Build Coastguard Worker call void @assume4(i64 %i.ext, i64 %a3) 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker %a4 = add i64 %a3, 625 113*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp ne i64 %i.ext, %a4 114*9880d681SAndroid Build Coastguard Worker call void @assume4(i64 %i.ext, i64 %a4) 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker ret void 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine void @fn(i32 %init) { 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker br label %loop 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Workerloop: 124*9880d681SAndroid Build Coastguard Worker %i = phi i32 [%init, %entry], [%next, %loop] 125*9880d681SAndroid Build Coastguard Worker call void @body(i32 %i) 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker %i.ext = zext i32 %i to i64 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker call void @assume5(i64 %i.ext, i64 500000000) 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker %i.next = add i64 %i.ext, 1 132*9880d681SAndroid Build Coastguard Worker %next = trunc i64 %i.next to i32 133*9880d681SAndroid Build Coastguard Worker %done = icmp eq i32 %i, 500000000 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker br i1 %done, label %exit, label %loop 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerexit: 138*9880d681SAndroid Build Coastguard Worker ret void 139*9880d681SAndroid Build Coastguard Worker}