139 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; 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
 | |
| } |