|  | ; RUN: opt %s -always-inline | opt -analyze -scalar-evolution | 
|  | ; There was optimization bug in ScalarEvolution, that causes too long | 
|  | ; compute time and stack overflow crash. | 
|  |  | 
|  | declare void @body(i32) | 
|  | declare void @llvm.assume(i1) | 
|  |  | 
|  | define available_externally void @assume1(i64 %i.ext, i64 %a) alwaysinline { | 
|  | %cmp0 = icmp ne i64 %i.ext, %a | 
|  | call void @llvm.assume(i1 %cmp0) | 
|  |  | 
|  | %a1 = add i64 %a, 1 | 
|  | %cmp1 = icmp ne i64 %i.ext, %a1 | 
|  | call void @llvm.assume(i1 %cmp1) | 
|  |  | 
|  | %a2 = add i64 %a1, 1 | 
|  | %cmp2 = icmp ne i64 %i.ext, %a2 | 
|  | call void @llvm.assume(i1 %cmp2) | 
|  |  | 
|  | %a3 = add i64 %a2, 1 | 
|  | %cmp3 = icmp ne i64 %i.ext, %a3 | 
|  | call void @llvm.assume(i1 %cmp3) | 
|  |  | 
|  | %a4 = add i64 %a3, 1 | 
|  | %cmp4 = icmp ne i64 %i.ext, %a4 | 
|  | call void @llvm.assume(i1 %cmp4) | 
|  |  | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define available_externally void @assume2(i64 %i.ext, i64 %a) alwaysinline { | 
|  | call void @assume1(i64 %i.ext, i64 %a) | 
|  |  | 
|  | %a1 = add i64 %a, 5 | 
|  | %cmp1 = icmp ne i64 %i.ext, %a1 | 
|  | call void @assume1(i64 %i.ext, i64 %a1) | 
|  |  | 
|  | %a2 = add i64 %a1, 5 | 
|  | %cmp2 = icmp ne i64 %i.ext, %a2 | 
|  | call void @assume1(i64 %i.ext, i64 %a2) | 
|  |  | 
|  | %a3 = add i64 %a2, 5 | 
|  | %cmp3 = icmp ne i64 %i.ext, %a3 | 
|  | call void @assume1(i64 %i.ext, i64 %a3) | 
|  |  | 
|  | %a4 = add i64 %a3, 5 | 
|  | %cmp4 = icmp ne i64 %i.ext, %a4 | 
|  | call void @assume1(i64 %i.ext, i64 %a4) | 
|  |  | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define available_externally void @assume3(i64 %i.ext, i64 %a) alwaysinline { | 
|  | call void @assume2(i64 %i.ext, i64 %a) | 
|  |  | 
|  | %a1 = add i64 %a, 25 | 
|  | %cmp1 = icmp ne i64 %i.ext, %a1 | 
|  | call void @assume2(i64 %i.ext, i64 %a1) | 
|  |  | 
|  | %a2 = add i64 %a1, 25 | 
|  | %cmp2 = icmp ne i64 %i.ext, %a2 | 
|  | call void @assume2(i64 %i.ext, i64 %a2) | 
|  |  | 
|  | %a3 = add i64 %a2, 25 | 
|  | %cmp3 = icmp ne i64 %i.ext, %a3 | 
|  | call void @assume2(i64 %i.ext, i64 %a3) | 
|  |  | 
|  | %a4 = add i64 %a3, 25 | 
|  | %cmp4 = icmp ne i64 %i.ext, %a4 | 
|  | call void @assume2(i64 %i.ext, i64 %a4) | 
|  |  | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define available_externally void @assume4(i64 %i.ext, i64 %a) alwaysinline { | 
|  | call void @assume3(i64 %i.ext, i64 %a) | 
|  |  | 
|  | %a1 = add i64 %a, 125 | 
|  | %cmp1 = icmp ne i64 %i.ext, %a1 | 
|  | call void @assume3(i64 %i.ext, i64 %a1) | 
|  |  | 
|  | %a2 = add i64 %a1, 125 | 
|  | %cmp2 = icmp ne i64 %i.ext, %a2 | 
|  | call void @assume3(i64 %i.ext, i64 %a2) | 
|  |  | 
|  | %a3 = add i64 %a2, 125 | 
|  | %cmp3 = icmp ne i64 %i.ext, %a3 | 
|  | call void @assume3(i64 %i.ext, i64 %a3) | 
|  |  | 
|  | %a4 = add i64 %a3, 125 | 
|  | %cmp4 = icmp ne i64 %i.ext, %a4 | 
|  | call void @assume3(i64 %i.ext, i64 %a4) | 
|  |  | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define available_externally void @assume5(i64 %i.ext, i64 %a) alwaysinline { | 
|  | call void @assume4(i64 %i.ext, i64 %a) | 
|  |  | 
|  | %a1 = add i64 %a, 625 | 
|  | %cmp1 = icmp ne i64 %i.ext, %a1 | 
|  | call void @assume4(i64 %i.ext, i64 %a1) | 
|  |  | 
|  | %a2 = add i64 %a1, 625 | 
|  | %cmp2 = icmp ne i64 %i.ext, %a2 | 
|  | call void @assume4(i64 %i.ext, i64 %a2) | 
|  |  | 
|  | %a3 = add i64 %a2, 625 | 
|  | %cmp3 = icmp ne i64 %i.ext, %a3 | 
|  | call void @assume4(i64 %i.ext, i64 %a3) | 
|  |  | 
|  | %a4 = add i64 %a3, 625 | 
|  | %cmp4 = icmp ne i64 %i.ext, %a4 | 
|  | call void @assume4(i64 %i.ext, i64 %a4) | 
|  |  | 
|  | ret void | 
|  | } | 
|  |  | 
|  | define void @fn(i32 %init) { | 
|  | entry: | 
|  | br label %loop | 
|  |  | 
|  | loop: | 
|  | %i = phi i32 [%init, %entry], [%next, %loop] | 
|  | call void @body(i32 %i) | 
|  |  | 
|  | %i.ext = zext i32 %i to i64 | 
|  |  | 
|  | call void @assume5(i64 %i.ext, i64 500000000) | 
|  |  | 
|  | %i.next = add i64 %i.ext, 1 | 
|  | %next = trunc i64 %i.next to i32 | 
|  | %done = icmp eq i32 %i, 500000000 | 
|  |  | 
|  | br i1 %done, label %exit, label %loop | 
|  |  | 
|  | exit: | 
|  | ret void | 
|  | } |