28 lines
		
	
	
		
			868 B
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			28 lines
		
	
	
		
			868 B
		
	
	
	
		
			LLVM
		
	
	
	
| ; RUN: opt -codegenprepare -S -mtriple=x86_64-linux < %s | FileCheck %s
 | |
| 
 | |
| declare void @llvm.assume(i1 noundef) nounwind willreturn
 | |
| 
 | |
| ; Recursively deleting dead operands of assume() may result in its next
 | |
| ; instruction deleted and the iterator pointing to the next instruction
 | |
| ; invalidated. This prevents the following simple loop in
 | |
| ; CodeGenPrepare::optimizeBlock() unless CurInstIterator is fixed:
 | |
| ;
 | |
| ;   CurInstIterator = BB.begin();
 | |
| ;   while (CurInstIterator != BB.end())
 | |
| ;     optimizeInst(&*CurInstIterator++, ModifiedDT);
 | |
| ;
 | |
| define i32 @test_assume_in_loop(i1 %cond1, i1 %cond2) {
 | |
| ; CHECK-LABEL: @test_assume_in_loop(
 | |
| ; CHECK-NEXT:  entry:
 | |
| entry:
 | |
|   br label %loop
 | |
| 
 | |
| ; CHECK: loop:
 | |
| ; CHECK-NEXT:  br label %loop
 | |
| loop:
 | |
|   %cond3 = phi i1 [%cond1, %entry], [%cond4, %loop]
 | |
|   call void @llvm.assume(i1 %cond3)
 | |
|   %cond4 = icmp ult i1 %cond1, %cond2
 | |
|   br label %loop
 | |
| }
 |