Skip to content

Commit

Permalink
SLPVectorizer: limit the number of alias checks to reduce the runtime.
Browse files Browse the repository at this point in the history
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.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@226439 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
eeckstein committed Jan 19, 2015
1 parent e6e4c78 commit 04075c6
Showing 1 changed file with 16 additions and 1 deletion.
17 changes: 16 additions & 1 deletion lib/Transforms/Vectorize/SLPVectorizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 04075c6

Please sign in to comment.