1Temporarily revert upstream llvm trunk r240144 (by Michael Zolotukhin): 2 3 [SLP] Vectorize for all-constant entries. 4 5This should fix libc++'s iostream initialization SIGBUSing whenever the 6global cout symbol is not aligned to 16 bytes. 7 8Introduced here: http://svnweb.freebsd.org/changeset/base/289072 9 10Index: lib/Transforms/Vectorize/SLPVectorizer.cpp 11=================================================================== 12--- lib/Transforms/Vectorize/SLPVectorizer.cpp 13+++ lib/Transforms/Vectorize/SLPVectorizer.cpp 14@@ -1642,10 +1642,8 @@ bool BoUpSLP::isFullyVectorizableTinyTree() { 15 if (VectorizableTree.size() != 2) 16 return false; 17 18- // Handle splat and all-constants stores. 19- if (!VectorizableTree[0].NeedToGather && 20- (allConstant(VectorizableTree[1].Scalars) || 21- isSplat(VectorizableTree[1].Scalars))) 22+ // Handle splat stores. 23+ if (!VectorizableTree[0].NeedToGather && isSplat(VectorizableTree[1].Scalars)) 24 return true; 25 26 // Gathering cost would be too much for tiny trees. 27Index: test/Transforms/SLPVectorizer/X86/tiny-tree.ll 28=================================================================== 29--- test/Transforms/SLPVectorizer/X86/tiny-tree.ll 30+++ test/Transforms/SLPVectorizer/X86/tiny-tree.ll 31@@ -153,19 +153,3 @@ define void @store_splat(float*, float) { 32 store float %1, float* %6, align 4 33 ret void 34 } 35- 36- 37-; CHECK-LABEL: store_const 38-; CHECK: store <4 x i32> 39-define void @store_const(i32* %a) { 40-entry: 41- %ptr0 = getelementptr inbounds i32, i32* %a, i64 0 42- store i32 10, i32* %ptr0, align 4 43- %ptr1 = getelementptr inbounds i32, i32* %a, i64 1 44- store i32 30, i32* %ptr1, align 4 45- %ptr2 = getelementptr inbounds i32, i32* %a, i64 2 46- store i32 20, i32* %ptr2, align 4 47- %ptr3 = getelementptr inbounds i32, i32* %a, i64 3 48- store i32 40, i32* %ptr3, align 4 49- ret void 50-} 51