SLPVectorizer: Try vectorizing 'splat' stores
authorArnold Schwaighofer <aschwaighofer@apple.com>
Mon, 24 Feb 2014 19:52:29 +0000 (19:52 +0000)
committerArnold Schwaighofer <aschwaighofer@apple.com>
Mon, 24 Feb 2014 19:52:29 +0000 (19:52 +0000)
Vectorize sequential stores of a broadcasted value.
5% on eon.

radar://16124699

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202067 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Vectorize/SLPVectorizer.cpp
test/Transforms/SLPVectorizer/X86/tiny-tree.ll

index 360652f3dce935f6d065c08b4298b63e0e81de9c..8e3ec815e82f57324334409016c7f2c8cfa96ed9 100644 (file)
@@ -1101,11 +1101,15 @@ bool BoUpSLP::isFullyVectorizableTinyTree() {
   if (VectorizableTree.size() != 2)
     return false;
 
+  // Handle splat stores.
+  if (!VectorizableTree[0].NeedToGather && isSplat(VectorizableTree[1].Scalars))
+    return true;
+
   // Gathering cost would be too much for tiny trees.
-  if (VectorizableTree[0].NeedToGather || VectorizableTree[1].NeedToGather) 
-    return false; 
+  if (VectorizableTree[0].NeedToGather || VectorizableTree[1].NeedToGather)
+    return false;
 
-  return true; 
+  return true;
 }
 
 int BoUpSLP::getTreeCost() {
index 2747a1f489977a2f9b34c779c66d3dd47561a810..10c3130b424c80f80c662361e4e80fcb8a49722e 100644 (file)
@@ -138,3 +138,18 @@ for.body:                                         ; preds = %entry, %for.body
 for.end:                                          ; preds = %for.body, %entry
   ret void
 }
+
+
+; CHECK-LABEL: store_splat
+; CHECK: store <4 x float>
+define void @store_splat(float*, float) {
+  %3 = getelementptr inbounds float* %0, i64 0
+  store float %1, float* %3, align 4
+  %4 = getelementptr inbounds float* %0, i64 1
+  store float %1, float* %4, align 4
+  %5 = getelementptr inbounds float* %0, i64 2
+  store float %1, float* %5, align 4
+  %6 = getelementptr inbounds float* %0, i64 3
+  store float %1, float* %6, align 4
+  ret void
+}