summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorErik Eckstein <eeckstein@apple.com>2015-01-19 09:33:38 +0000
committerErik Eckstein <eeckstein@apple.com>2015-01-19 09:33:38 +0000
commit76cb53a839643a3dfa86dd0abccbd3b48a782f8e (patch)
tree9e7381254ff525b793c9caf772bee25fc92fb503 /llvm/lib
parent141c5a9ae097596ea850c96caaae6501ce326073 (diff)
downloadbcm5719-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')
-rw-r--r--llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp17
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;
OpenPOWER on IntegriCloud