47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; RUN: opt -S -codegenprepare -mtriple=x86_64-linux < %s | FileCheck %s
 | |
| ;
 | |
| ; Ensure that blocks that only contain @llvm.assume are removed completely
 | |
| ; during CodeGenPrepare.
 | |
| 
 | |
| ; CHECK-LABEL: @simple(
 | |
| ; CHECK-NEXT: end:
 | |
| ; CHECK-NEXT: ret void
 | |
| define void @simple(i64 %addr, i1 %assumption) {
 | |
|   %cmp1 = icmp eq i64 %addr, 0
 | |
|   br i1 %cmp1, label %do_assume, label %end
 | |
| 
 | |
| do_assume:
 | |
|   tail call void @llvm.assume(i1 %assumption)
 | |
|   br label %end
 | |
| 
 | |
| end:
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| ; CHECK-LABEL: @complex_assume(
 | |
| ; CHECK-NEXT: end:
 | |
| ; CHECK-NEXT: ret void
 | |
| define void @complex_assume(i64 %addr, i1 %assumption_a, i1 %assumption_b,
 | |
|                           i64 %val_a, i64 %val_b) {
 | |
|   %cmp1 = icmp eq i64 %addr, 0
 | |
|   br i1 %cmp1, label %do_assume, label %end
 | |
| 
 | |
| do_assume:
 | |
|   call void @llvm.assume(i1 %assumption_a)
 | |
|   call void @llvm.assume(i1 %assumption_b)
 | |
|   %val_xor = xor i64 %val_a, %val_b
 | |
|   %val_shifted = lshr i64 %val_xor, 7
 | |
|   %assumption_c = trunc i64 %val_shifted to i1
 | |
|   call void @llvm.assume(i1 %assumption_c)
 | |
|   %assumption_d = call i1 @readonly_func(i64 %val_b)
 | |
|   call void @llvm.assume(i1 %assumption_d)
 | |
|   br label %end
 | |
| 
 | |
| end:
 | |
|   ret void
 | |
| }
 | |
| 
 | |
| declare void @llvm.assume(i1 noundef)
 | |
| declare i1 @readonly_func(i64) nounwind readonly willreturn;
 | |
| 
 |