Nadav Rotem 53a0552b06 SLP Vectorizer: Implement multi-block slp-vectorization.
Rewrote the SLP-vectorization as a whole-function vectorization pass. It is now able to vectorize chains across multiple basic blocks.
It still does not vectorize PHIs, but this should be easy to do now that we scan the entire function.
I removed the support for extracting values from trees.
We are now able to vectorize more programs, but there are some serious regressions in many workloads (such as flops-6 and mandel-2).



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184647 91177308-0d34-0410-b5e6-96231b3b80d8
2013-06-22 21:34:10 +00:00

56 lines
1.6 KiB
LLVM

; RUN: opt < %s -basicaa -slp-vectorizer -dce -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.7.0"
; int bar(double *A, int d) {
; double A0 = A[0];
; double A1 = A[1];
; float F0 = A0;
; float F1 = A1;
; if (d) foo(); <----- This splits the blocks
; F0+=4.0;
; F1+=5.0;
; A[8] = 9.0 + F0;
; A[9] = 5.0 + F1;
; }
;CHECK: @bar
;CHECK: load <2 x double>
;CHECK: fptrunc <2 x double>
;CHECK: call i32
;CHECK: fadd <2 x float>
;CHECK: fpext <2 x float>
;CHECK: store <2 x double>
;CHECK: ret
define i32 @bar(double* nocapture %A, i32 %d) {
%1 = load double* %A, align 8
%2 = getelementptr inbounds double* %A, i64 1
%3 = load double* %2, align 8
%4 = fptrunc double %1 to float
%5 = fptrunc double %3 to float
%6 = icmp eq i32 %d, 0
br i1 %6, label %9, label %7
; <label>:7 ; preds = %0
%8 = tail call i32 (...)* @foo()
br label %9
; <label>:9 ; preds = %0, %7
%10 = fadd float %4, 4.000000e+00
%11 = fadd float %5, 5.000000e+00
%12 = fpext float %10 to double
%13 = fadd double %12, 9.000000e+00
%14 = getelementptr inbounds double* %A, i64 8
store double %13, double* %14, align 8
%15 = fpext float %11 to double
%16 = fadd double %15, 5.000000e+00
%17 = getelementptr inbounds double* %A, i64 9
store double %16, double* %17, align 8
ret i32 undef
}
declare i32 @foo(...)