From ad85d7a04218648a3ddc029f9200805c8b6e4960 Mon Sep 17 00:00:00 2001 From: Michael Zolotukhin Date: Fri, 19 Jun 2015 17:40:15 +0000 Subject: [PATCH] [SLP] Vectorize for all-constant entries. Differential Revision: http://reviews.llvm.org/D10531 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240144 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Vectorize/SLPVectorizer.cpp | 6 ++++-- test/Transforms/SLPVectorizer/X86/tiny-tree.ll | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp index 149936b11b3..370e2956ac4 100644 --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -1637,8 +1637,10 @@ bool BoUpSLP::isFullyVectorizableTinyTree() { if (VectorizableTree.size() != 2) return false; - // Handle splat stores. - if (!VectorizableTree[0].NeedToGather && isSplat(VectorizableTree[1].Scalars)) + // Handle splat and all-constants stores. + if (!VectorizableTree[0].NeedToGather && + (allConstant(VectorizableTree[1].Scalars) || + isSplat(VectorizableTree[1].Scalars))) return true; // Gathering cost would be too much for tiny trees. diff --git a/test/Transforms/SLPVectorizer/X86/tiny-tree.ll b/test/Transforms/SLPVectorizer/X86/tiny-tree.ll index 6c93222ef93..26af8165bc3 100644 --- a/test/Transforms/SLPVectorizer/X86/tiny-tree.ll +++ b/test/Transforms/SLPVectorizer/X86/tiny-tree.ll @@ -153,3 +153,19 @@ define void @store_splat(float*, float) { store float %1, float* %6, align 4 ret void } + + +; CHECK-LABEL: store_const +; CHECK: store <4 x i32> +define void @store_const(i32* %a) { +entry: + %ptr0 = getelementptr inbounds i32, i32* %a, i64 0 + store i32 10, i32* %ptr0, align 4 + %ptr1 = getelementptr inbounds i32, i32* %a, i64 1 + store i32 30, i32* %ptr1, align 4 + %ptr2 = getelementptr inbounds i32, i32* %a, i64 2 + store i32 20, i32* %ptr2, align 4 + %ptr3 = getelementptr inbounds i32, i32* %a, i64 3 + store i32 40, i32* %ptr3, align 4 + ret void +} -- 2.34.1