Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[CaptureTracker] Provide an ordered basic block to PointerMayBeCaptur…
…edBefore This patch is a follow up from r240560 and is a step further into mitigating the compile time performance issues in CaptureTracker. By providing the CaptureTracker with a "cached ordered basic block" instead of computing it every time, MemDepAnalysis can use this cache throughout its calls to AA->callCapturesBefore, avoiding to recompute it for every scanned instruction. In the same testcase used in r240560, compile time is reduced from 2min to 30s. This also fixes PR22348. rdar://problem/19230319 Differential Revision: http://reviews.llvm.org/D11364 llvm-svn: 243750
- Loading branch information
1 parent
8b559ec
commit dfc1d96
Showing
8 changed files
with
205 additions
and
81 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
//===- llvm/Analysis/OrderedBasicBlock.h --------------------- -*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines the OrderedBasicBlock class. OrderedBasicBlock maintains | ||
// an interface where clients can query if one instruction comes before another | ||
// in a BasicBlock. Since BasicBlock currently lacks a reliable way to query | ||
// relative position between instructions one can use OrderedBasicBlock to do | ||
// such queries. OrderedBasicBlock is lazily built on a source BasicBlock and | ||
// maintains an internal Instruction -> Position map. A OrderedBasicBlock | ||
// instance should be discarded whenever the source BasicBlock changes. | ||
// | ||
// It's currently used by the CaptureTracker in order to find relative | ||
// positions of a pair of instructions inside a BasicBlock. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_ANALYSIS_ORDEREDBASICBLOCK_H | ||
#define LLVM_ANALYSIS_ORDEREDBASICBLOCK_H | ||
|
||
#include "llvm/ADT/DenseMap.h" | ||
#include "llvm/IR/BasicBlock.h" | ||
|
||
namespace llvm { | ||
|
||
class Instruction; | ||
class BasicBlock; | ||
|
||
class OrderedBasicBlock { | ||
private: | ||
/// \brief Map a instruction to its position in a BasicBlock. | ||
SmallDenseMap<const Instruction *, unsigned, 32> NumberedInsts; | ||
|
||
/// \brief Keep track of last instruction inserted into \p NumberedInsts. | ||
/// It speeds up queries for uncached instructions by providing a start point | ||
/// for new queries in OrderedBasicBlock::comesBefore. | ||
BasicBlock::const_iterator LastInstFound; | ||
|
||
/// \brief The position/number to tag the next instruction to be found. | ||
unsigned NextInstPos; | ||
|
||
/// \brief The source BasicBlock to map. | ||
const BasicBlock *BB; | ||
|
||
/// \brief Given no cached results, find if \p A comes before \p B in \p BB. | ||
/// Cache and number out instruction while walking \p BB. | ||
bool comesBefore(const Instruction *A, const Instruction *B); | ||
|
||
public: | ||
OrderedBasicBlock(const BasicBlock *BasicB); | ||
|
||
/// \brief Find out whether \p A dominates \p B, meaning whether \p A | ||
/// comes before \p B in \p BB. This is a simplification that considers | ||
/// cached instruction positions and ignores other basic blocks, being | ||
/// only relevant to compare relative instructions positions inside \p BB. | ||
bool dominates(const Instruction *A, const Instruction *B); | ||
}; | ||
|
||
} // End llvm namespace | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.