76 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; RUN: opt -S -loop-vectorize -mtriple=x86_64-apple-darwin %s | FileCheck %s
 | |
| 
 | |
| ; Two mostly identical functions. The only difference is the presence of
 | |
| ; fast-math flags on the second. The loop is a pretty simple reduction:
 | |
| 
 | |
| ; for (int i = 0; i < 32; ++i)
 | |
| ;   if (arr[i] != 42)
 | |
| ;     tot += arr[i];
 | |
| 
 | |
| define double @sumIfScalar(double* nocapture readonly %arr) {
 | |
| ; CHECK-LABEL: define double @sumIfScalar
 | |
| ; CHECK-NOT: <2 x double>
 | |
| 
 | |
| entry:
 | |
|   br label %loop
 | |
| 
 | |
| loop:
 | |
|   %i = phi i32 [0, %entry], [%i.next, %next.iter]
 | |
|   %tot = phi double [0.0, %entry], [%tot.next, %next.iter]
 | |
| 
 | |
|   %addr = getelementptr double, double* %arr, i32 %i
 | |
|   %nextval = load double, double* %addr
 | |
| 
 | |
|   %tst = fcmp une double %nextval, 42.0
 | |
|   br i1 %tst, label %do.add, label %no.add
 | |
| 
 | |
| do.add:
 | |
|   %tot.new = fadd double %tot, %nextval
 | |
|   br label %next.iter
 | |
| 
 | |
| no.add:
 | |
|   br label %next.iter
 | |
| 
 | |
| next.iter:
 | |
|   %tot.next = phi double [%tot, %no.add], [%tot.new, %do.add]
 | |
|   %i.next = add i32 %i, 1
 | |
|   %again = icmp ult i32 %i.next, 32
 | |
|   br i1 %again, label %loop, label %done
 | |
| 
 | |
| done:
 | |
|   ret double %tot.next
 | |
| }
 | |
| 
 | |
| define double @sumIfVector(double* nocapture readonly %arr) {
 | |
| ; CHECK-LABEL: define double @sumIfVector
 | |
| ; CHECK: <2 x double>
 | |
| entry:
 | |
|   br label %loop
 | |
| 
 | |
| loop:
 | |
|   %i = phi i32 [0, %entry], [%i.next, %next.iter]
 | |
|   %tot = phi double [0.0, %entry], [%tot.next, %next.iter]
 | |
| 
 | |
|   %addr = getelementptr double, double* %arr, i32 %i
 | |
|   %nextval = load double, double* %addr
 | |
| 
 | |
|   %tst = fcmp fast une double %nextval, 42.0
 | |
|   br i1 %tst, label %do.add, label %no.add
 | |
| 
 | |
| do.add:
 | |
|   %tot.new = fadd fast double %tot, %nextval
 | |
|   br label %next.iter
 | |
| 
 | |
| no.add:
 | |
|   br label %next.iter
 | |
| 
 | |
| next.iter:
 | |
|   %tot.next = phi double [%tot, %no.add], [%tot.new, %do.add]
 | |
|   %i.next = add i32 %i, 1
 | |
|   %again = icmp ult i32 %i.next, 32
 | |
|   br i1 %again, label %loop, label %done
 | |
| 
 | |
| done:
 | |
|   ret double %tot.next
 | |
| }
 |