diff options
author | Nadav Rotem <nrotem@apple.com> | 2013-07-19 23:11:15 +0000 |
---|---|---|
committer | Nadav Rotem <nrotem@apple.com> | 2013-07-19 23:11:15 +0000 |
commit | dc4ddd32012e93ac13f36e2d2a8c3ee760f44eb4 (patch) | |
tree | f52ea1fb7c5a36b62cd36c600f1f5c35734eb2df | |
parent | 272458bd06d0c6d09e9bf776fb60735b0cdc8cf1 (diff) | |
download | external_llvm-dc4ddd32012e93ac13f36e2d2a8c3ee760f44eb4.zip external_llvm-dc4ddd32012e93ac13f36e2d2a8c3ee760f44eb4.tar.gz external_llvm-dc4ddd32012e93ac13f36e2d2a8c3ee760f44eb4.tar.bz2 |
SLPVectorizer: Improve the compile time of isConsecutive by reordering the conditions that check GEPs and eliminate two of the calls to accumulateConstantOffset.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186731 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Vectorize/SLPVectorizer.cpp | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp index f1da774..42aa8a2 100644 --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -994,19 +994,27 @@ bool BoUpSLP::isConsecutiveAccess(Value *A, Value *B) { Type *Ty = cast<PointerType>(PtrA->getType())->getElementType(); int64_t Sz = DL->getTypeStoreSize(Ty); - // If both pointers are GEPs: - if (GepA && GepB) { - // Check that they have the same base pointer. - if (GepA->getPointerOperand() != GepB->getPointerOperand()) - return false; + // Check if PtrA is the base and PtrB is a constant offset. + if (GepB && GepB->getPointerOperand() == PtrA) { + APInt Offset(BW, 0); + if (GepB->accumulateConstantOffset(*DL, Offset)) + return Offset.getSExtValue() == Sz; + return false; + } - // Check if the geps use a constant offset. - APInt OffsetA(BW, 0) ,OffsetB(BW, 0); - if (GepA->accumulateConstantOffset(*DL, OffsetA) && - GepB->accumulateConstantOffset(*DL, OffsetB)) - return ((OffsetB.getSExtValue() - OffsetA.getSExtValue()) == Sz); + // Check if PtrB is the base and PtrA is a constant offset. + if (GepA && GepA->getPointerOperand() == PtrB) { + APInt Offset(BW, 0); + if (GepA->accumulateConstantOffset(*DL, Offset)) + return Offset.getSExtValue() == -Sz; + return false; + } - if (GepA->getNumIndices() != GepB->getNumIndices()) + // If both pointers are GEPs: + if (GepA && GepB) { + // Check that they have the same base pointer and number of indices. + if (GepA->getPointerOperand() != GepB->getPointerOperand() || + GepA->getNumIndices() != GepB->getNumIndices()) return false; // Try to strip the geps. This makes SCEV faster. @@ -1022,17 +1030,6 @@ bool BoUpSLP::isConsecutiveAccess(Value *A, Value *B) { Sz = 1; } - // Check if PtrA is the base and PtrB is a constant offset. - if (GepB && GepB->getPointerOperand() == PtrA) { - APInt Offset(BW, 0); - if (GepB->accumulateConstantOffset(*DL, Offset)) - return Offset.getZExtValue() == DL->getTypeStoreSize(Ty); - } - - // GepA can't use PtrB as a base pointer. - if (GepA && GepA->getPointerOperand() == PtrB) - return false; - ConstantInt *CA = dyn_cast<ConstantInt>(PtrA); ConstantInt *CB = dyn_cast<ConstantInt>(PtrB); if (CA && CB) { |