mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
a675c74208
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
|
|
}
|
|
|
|
|