140 lines · plain
1; RUN: opt %s -passes=always-inline | opt -passes='print<scalar-evolution>'2; There was optimization bug in ScalarEvolution, that causes too long3; compute time and stack overflow crash.4 5declare void @body(i32)6declare void @llvm.assume(i1)7 8define available_externally void @assume1(i64 %i.ext, i64 %a) alwaysinline {9 %cmp0 = icmp ne i64 %i.ext, %a10 call void @llvm.assume(i1 %cmp0)11 12 %a1 = add i64 %a, 113 %cmp1 = icmp ne i64 %i.ext, %a114 call void @llvm.assume(i1 %cmp1)15 16 %a2 = add i64 %a1, 117 %cmp2 = icmp ne i64 %i.ext, %a218 call void @llvm.assume(i1 %cmp2)19 20 %a3 = add i64 %a2, 121 %cmp3 = icmp ne i64 %i.ext, %a322 call void @llvm.assume(i1 %cmp3)23 24 %a4 = add i64 %a3, 125 %cmp4 = icmp ne i64 %i.ext, %a426 call void @llvm.assume(i1 %cmp4)27 28 ret void29}30 31define available_externally void @assume2(i64 %i.ext, i64 %a) alwaysinline {32 call void @assume1(i64 %i.ext, i64 %a)33 34 %a1 = add i64 %a, 535 %cmp1 = icmp ne i64 %i.ext, %a136 call void @assume1(i64 %i.ext, i64 %a1)37 38 %a2 = add i64 %a1, 539 %cmp2 = icmp ne i64 %i.ext, %a240 call void @assume1(i64 %i.ext, i64 %a2)41 42 %a3 = add i64 %a2, 543 %cmp3 = icmp ne i64 %i.ext, %a344 call void @assume1(i64 %i.ext, i64 %a3)45 46 %a4 = add i64 %a3, 547 %cmp4 = icmp ne i64 %i.ext, %a448 call void @assume1(i64 %i.ext, i64 %a4)49 50 ret void51}52 53define available_externally void @assume3(i64 %i.ext, i64 %a) alwaysinline {54 call void @assume2(i64 %i.ext, i64 %a)55 56 %a1 = add i64 %a, 2557 %cmp1 = icmp ne i64 %i.ext, %a158 call void @assume2(i64 %i.ext, i64 %a1)59 60 %a2 = add i64 %a1, 2561 %cmp2 = icmp ne i64 %i.ext, %a262 call void @assume2(i64 %i.ext, i64 %a2)63 64 %a3 = add i64 %a2, 2565 %cmp3 = icmp ne i64 %i.ext, %a366 call void @assume2(i64 %i.ext, i64 %a3)67 68 %a4 = add i64 %a3, 2569 %cmp4 = icmp ne i64 %i.ext, %a470 call void @assume2(i64 %i.ext, i64 %a4)71 72 ret void73}74 75define available_externally void @assume4(i64 %i.ext, i64 %a) alwaysinline {76 call void @assume3(i64 %i.ext, i64 %a)77 78 %a1 = add i64 %a, 12579 %cmp1 = icmp ne i64 %i.ext, %a180 call void @assume3(i64 %i.ext, i64 %a1)81 82 %a2 = add i64 %a1, 12583 %cmp2 = icmp ne i64 %i.ext, %a284 call void @assume3(i64 %i.ext, i64 %a2)85 86 %a3 = add i64 %a2, 12587 %cmp3 = icmp ne i64 %i.ext, %a388 call void @assume3(i64 %i.ext, i64 %a3)89 90 %a4 = add i64 %a3, 12591 %cmp4 = icmp ne i64 %i.ext, %a492 call void @assume3(i64 %i.ext, i64 %a4)93 94 ret void95}96 97define available_externally void @assume5(i64 %i.ext, i64 %a) alwaysinline {98 call void @assume4(i64 %i.ext, i64 %a)99 100 %a1 = add i64 %a, 625101 %cmp1 = icmp ne i64 %i.ext, %a1102 call void @assume4(i64 %i.ext, i64 %a1)103 104 %a2 = add i64 %a1, 625105 %cmp2 = icmp ne i64 %i.ext, %a2106 call void @assume4(i64 %i.ext, i64 %a2)107 108 %a3 = add i64 %a2, 625109 %cmp3 = icmp ne i64 %i.ext, %a3110 call void @assume4(i64 %i.ext, i64 %a3)111 112 %a4 = add i64 %a3, 625113 %cmp4 = icmp ne i64 %i.ext, %a4114 call void @assume4(i64 %i.ext, i64 %a4)115 116 ret void117}118 119define void @fn(i32 %init) {120entry:121 br label %loop122 123loop:124 %i = phi i32 [%init, %entry], [%next, %loop]125 call void @body(i32 %i)126 127 %i.ext = zext i32 %i to i64128 129 call void @assume5(i64 %i.ext, i64 500000000)130 131 %i.next = add i64 %i.ext, 1132 %next = trunc i64 %i.next to i32133 %done = icmp eq i32 %i, 500000000134 135 br i1 %done, label %exit, label %loop136 137exit:138 ret void139}140