mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	We don't have a detailed analysis on which values are vectorized and which stay scalars in the vectorized loop so we use another method. We look at reduction variables, loads and stores, which are the only ways to get information in and out of loop iterations. If the data types are extended and truncated then the cost model will catch the cost of the vector zext/sext/trunc operations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@172178 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
| ; RUN: opt < %s  -loop-vectorize -mtriple=thumbv7-apple-ios3.0.0 -S | FileCheck %s
 | |
| 
 | |
| target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
 | |
| target triple = "thumbv7-apple-ios3.0.0"
 | |
| 
 | |
| ;CHECK:foo_F64
 | |
| ;CHECK: <2 x double>
 | |
| ;CHECK:ret
 | |
| define double @foo_F64(double* nocapture %A, i32 %n) nounwind uwtable readonly ssp {
 | |
|   %1 = icmp sgt i32 %n, 0
 | |
|   br i1 %1, label %.lr.ph, label %._crit_edge
 | |
| 
 | |
| .lr.ph:                                           ; preds = %0, %.lr.ph
 | |
|   %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ]
 | |
|   %prod.01 = phi double [ %4, %.lr.ph ], [ 0.000000e+00, %0 ]
 | |
|   %2 = getelementptr inbounds double* %A, i64 %indvars.iv
 | |
|   %3 = load double* %2, align 8
 | |
|   %4 = fmul fast double %prod.01, %3
 | |
|   %indvars.iv.next = add i64 %indvars.iv, 1
 | |
|   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
 | |
|   %exitcond = icmp eq i32 %lftr.wideiv, %n
 | |
|   br i1 %exitcond, label %._crit_edge, label %.lr.ph
 | |
| 
 | |
| ._crit_edge:                                      ; preds = %.lr.ph, %0
 | |
|   %prod.0.lcssa = phi double [ 0.000000e+00, %0 ], [ %4, %.lr.ph ]
 | |
|   ret double %prod.0.lcssa
 | |
| }
 | |
| 
 | |
| ;CHECK:foo_I8
 | |
| ;CHECK: xor <16 x i8>
 | |
| ;CHECK:ret
 | |
| define signext i8 @foo_I8(i8* nocapture %A, i32 %n) nounwind uwtable readonly ssp {
 | |
|   %1 = icmp sgt i32 %n, 0
 | |
|   br i1 %1, label %.lr.ph, label %._crit_edge
 | |
| 
 | |
| .lr.ph:                                           ; preds = %0, %.lr.ph
 | |
|   %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %0 ]
 | |
|   %red.01 = phi i8 [ %4, %.lr.ph ], [ 0, %0 ]
 | |
|   %2 = getelementptr inbounds i8* %A, i64 %indvars.iv
 | |
|   %3 = load i8* %2, align 1
 | |
|   %4 = xor i8 %3, %red.01
 | |
|   %indvars.iv.next = add i64 %indvars.iv, 1
 | |
|   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
 | |
|   %exitcond = icmp eq i32 %lftr.wideiv, %n
 | |
|   br i1 %exitcond, label %._crit_edge, label %.lr.ph
 | |
| 
 | |
| ._crit_edge:                                      ; preds = %.lr.ph, %0
 | |
|   %red.0.lcssa = phi i8 [ 0, %0 ], [ %4, %.lr.ph ]
 | |
|   ret i8 %red.0.lcssa
 | |
| }
 | |
| 
 | |
| 
 |