Skip to content

Commit

Permalink
Make the SLP store-merger less paranoid about function calls. We chec…
Browse files Browse the repository at this point in the history
…k for function calls when we check if it is safe to sink instructions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179207 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
nadavrot committed Apr 10, 2013
1 parent 20cd5e6 commit 4b924d3
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 4 deletions.
4 changes: 0 additions & 4 deletions lib/Transforms/Vectorize/SLPVectorizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,6 @@ struct SLPVectorizer : public BasicBlockPass {
/// if we flush the chain creation every time we run into a memory barrier.
bool CollectStores(BasicBlock *BB, BoUpSLP &R) {
for (BasicBlock::iterator it = BB->begin(), e = BB->end(); it != e; ++it) {
// Can't vectorize instructions with side effects.
if (it->mayThrow())
return false;

StoreInst *SI = dyn_cast<StoreInst>(it);
if (!SI)
continue;
Expand Down
40 changes: 40 additions & 0 deletions test/Transforms/SLPVectorizer/X86/barriercall.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
; 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.8.0"

;CHECK: @foo
;CHECK: store <4 x i32>
;CHECK: ret
define i32 @foo(i32* nocapture %A, i32 %n) #0 {
entry:
%call = tail call i32 (...)* @bar() #2
%mul = mul nsw i32 %n, 5
%add = add nsw i32 %mul, 9
store i32 %add, i32* %A, align 4, !tbaa !0
%mul1 = mul nsw i32 %n, 9
%add2 = add nsw i32 %mul1, 9
%arrayidx3 = getelementptr inbounds i32* %A, i64 1
store i32 %add2, i32* %arrayidx3, align 4, !tbaa !0
%mul4 = shl i32 %n, 3
%add5 = add nsw i32 %mul4, 9
%arrayidx6 = getelementptr inbounds i32* %A, i64 2
store i32 %add5, i32* %arrayidx6, align 4, !tbaa !0
%mul7 = mul nsw i32 %n, 10
%add8 = add nsw i32 %mul7, 9
%arrayidx9 = getelementptr inbounds i32* %A, i64 3
store i32 %add8, i32* %arrayidx9, align 4, !tbaa !0
ret i32 undef
}

; We can still vectorize the stores below.

declare i32 @bar(...) #1

attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind }

!0 = metadata !{metadata !"int", metadata !1}
!1 = metadata !{metadata !"omnipotent char", metadata !2}
!2 = metadata !{metadata !"Simple C/C++ TBAA"}

0 comments on commit 4b924d3

Please sign in to comment.