VPlan is an ongoing effort to refactor and extend the Loop Vectorizer. This patch introduces the VPlan model into LV and uses it to represent the vectorized code and drive the generation of vectorized IR. In this patch VPlan models the vectorized loop body: the vectorized control-flow is represented using VPlan's Hierarchical CFG, with predication refactored from being a post-vectorization-step into a vectorization planning step modeling if-then VPRegionBlocks, and generating code inline with non-predicated code. The vectorized code within each VPBasicBlock is represented as a sequence of Recipes, each responsible for modelling and generating a sequence of IR instructions. To keep the size of this commit manageable the Recipes in this patch are coarse-grained and capture large chunks of LV's code-generation logic. The constructed VPlans are dumped in dot format under -debug. This commit retains current vectorizer output, except for minor instruction reorderings; see associated modifications to lit tests. For further details on the VPlan model see docs/Proposals/VectorizationPlan.rst and its references. Authors: Gil Rapaport and Ayal Zaks Differential Revision: https://reviews.llvm.org/D32871 llvm-svn: 311077
34 lines
1.1 KiB
LLVM
34 lines
1.1 KiB
LLVM
; REQUIRES: asserts
|
|
; RUN: opt -mtriple=s390x-unknown-linux -mcpu=z13 -loop-vectorize \
|
|
; RUN: -force-vector-width=4 -debug-only=loop-vectorize \
|
|
; RUN: -disable-output -enable-interleaved-mem-accesses=false < %s 2>&1 | \
|
|
; RUN: FileCheck %s
|
|
;
|
|
; Check that a scalarized load/store does not get a cost for insterts/
|
|
; extracts, since z13 supports element load/store.
|
|
|
|
define void @fun(i32* %data, i64 %n) {
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body:
|
|
%i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
|
|
%tmp0 = getelementptr inbounds i32, i32* %data, i64 %i
|
|
%tmp1 = load i32, i32* %tmp0, align 4
|
|
%tmp2 = add i32 %tmp1, 1
|
|
store i32 %tmp2, i32* %tmp0, align 4
|
|
%i.next = add nuw nsw i64 %i, 2
|
|
%cond = icmp slt i64 %i.next, %n
|
|
br i1 %cond, label %for.body, label %for.end
|
|
|
|
for.end:
|
|
ret void
|
|
|
|
; CHECK: LV: Scalarizing: %tmp1 = load i32, i32* %tmp0, align 4
|
|
; CHECK: LV: Scalarizing: store i32 %tmp2, i32* %tmp0, align 4
|
|
|
|
; CHECK: LV: Found an estimated cost of 4 for VF 4 For instruction: %tmp1 = load i32, i32* %tmp0, align 4
|
|
; CHECK: LV: Found an estimated cost of 4 for VF 4 For instruction: store i32 %tmp2, i32* %tmp0, align 4
|
|
}
|
|
|