diff options
author | Erik Eckstein <eeckstein@apple.com> | 2015-01-19 09:33:38 +0000 |
---|---|---|
committer | Erik Eckstein <eeckstein@apple.com> | 2015-01-19 09:33:38 +0000 |
commit | 76cb53a839643a3dfa86dd0abccbd3b48a782f8e (patch) | |
tree | 9e7381254ff525b793c9caf772bee25fc92fb503 /llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | |
parent | 141c5a9ae097596ea850c96caaae6501ce326073 (diff) | |
download | bcm5719-llvm-76cb53a839643a3dfa86dd0abccbd3b48a782f8e.tar.gz bcm5719-llvm-76cb53a839643a3dfa86dd0abccbd3b48a782f8e.zip |
SLPVectorizer: limit the number of alias checks to reduce the runtime.
In case of blocks with many memory-accessing instructions, alias checking can take lot of time
(because calculating the memory dependencies has quadratic complexity).
I chose a limit which resulted in no changes when running the benchmarks.
llvm-svn: 226439
Diffstat (limited to 'llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp')
-rw-r--r-- | llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index fa6f6cd9817..3524d84b1f1 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -75,6 +75,10 @@ static const unsigned MinVecRegSize = 128; static const unsigned RecursionMaxDepth = 12; +// Limit the number of alias checks. The limit is chosen so that +// it has no negative effect on the llvm benchmarks. +static const unsigned AliasedCheckLimit = 10; + /// \returns the parent basic block if all of the instructions in \p VL /// are in the same block or null otherwise. static BasicBlock *getSameBlock(ArrayRef<Value *> VL) { @@ -2754,11 +2758,22 @@ void BoUpSLP::BlockScheduling::calculateDependencies(ScheduleData *SD, Instruction *SrcInst = BundleMember->Inst; AliasAnalysis::Location SrcLoc = getLocation(SrcInst, SLP->AA); bool SrcMayWrite = BundleMember->Inst->mayWriteToMemory(); + unsigned numAliased = 0; while (DepDest) { assert(isInSchedulingRegion(DepDest)); if (SrcMayWrite || DepDest->Inst->mayWriteToMemory()) { - if (SLP->isAliased(SrcLoc, SrcInst, DepDest->Inst)) { + + // Limit the number of alias checks, becaus SLP->isAliased() is + // the expensive part in the following loop. + if (numAliased >= AliasedCheckLimit + || SLP->isAliased(SrcLoc, SrcInst, DepDest->Inst)) { + + // We increment the counter only if the locations are aliased + // (instead of counting all alias checks). This gives a better + // balance between reduced runtime accurate dependencies. + numAliased++; + DepDest->MemoryDependencies.push_back(BundleMember); BundleMember->Dependencies++; ScheduleData *DestBundle = DepDest->FirstInBundle; |