mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
[LICM] Refactor to expose functionality as utility functions
This refactors the core functionality of LICM: HoistRegion, SinkRegion and PromoteAliasSet (renamed to promoteLoopAccessesToScalars) as utility functions in LoopUtils. This will enable other transformations to make use of them directly. Patch by Ashutosh Nema. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230178 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -24,6 +24,19 @@ class Loop;
|
||||
class LoopInfo;
|
||||
class Pass;
|
||||
class ScalarEvolution;
|
||||
class AliasSetTracker;
|
||||
class AliasSet;
|
||||
class PredIteratorCache;
|
||||
|
||||
/// \brief Captures loop safety information.
|
||||
/// It keep information for loop & its header may throw exception.
|
||||
struct LICMSafetyInfo {
|
||||
bool MayThrow; // The current loop contains an instruction which
|
||||
// may throw.
|
||||
bool HeaderMayThrow; // Same as previous, but specific to loop header
|
||||
LICMSafetyInfo() : MayThrow(false), HeaderMayThrow(false)
|
||||
{}
|
||||
};
|
||||
|
||||
BasicBlock *InsertPreheaderForLoop(Loop *L, Pass *P);
|
||||
|
||||
@@ -63,6 +76,49 @@ bool formLCSSA(Loop &L, DominatorTree &DT, LoopInfo *LI,
|
||||
/// Returns true if any modifications are made to the loop.
|
||||
bool formLCSSARecursively(Loop &L, DominatorTree &DT, LoopInfo *LI,
|
||||
ScalarEvolution *SE = nullptr);
|
||||
|
||||
/// \brief Walk the specified region of the CFG (defined by all blocks
|
||||
/// dominated by the specified block, and that are in the current loop) in
|
||||
/// reverse depth first order w.r.t the DominatorTree. This allows us to visit
|
||||
/// uses before definitions, allowing us to sink a loop body in one pass without
|
||||
/// iteration. Takes DomTreeNode, AliasAnalysis, LoopInfo, DominatorTree,
|
||||
/// DataLayout, TargetLibraryInfo, Loop, AliasSet information for all
|
||||
/// instructions of the loop and loop safety information as arguments.
|
||||
/// It returns changed status.
|
||||
bool sinkRegion(DomTreeNode *, AliasAnalysis *, LoopInfo *, DominatorTree *,
|
||||
const DataLayout *, TargetLibraryInfo *, Loop *,
|
||||
AliasSetTracker *, LICMSafetyInfo *);
|
||||
|
||||
/// \brief Walk the specified region of the CFG (defined by all blocks
|
||||
/// dominated by the specified block, and that are in the current loop) in depth
|
||||
/// first order w.r.t the DominatorTree. This allows us to visit definitions
|
||||
/// before uses, allowing us to hoist a loop body in one pass without iteration.
|
||||
/// Takes DomTreeNode, AliasAnalysis, LoopInfo, DominatorTree, DataLayout,
|
||||
/// TargetLibraryInfo, Loop, AliasSet information for all instructions of the
|
||||
/// loop and loop safety information as arguments. It returns changed status.
|
||||
bool hoistRegion(DomTreeNode *, AliasAnalysis *, LoopInfo *, DominatorTree *,
|
||||
const DataLayout *, TargetLibraryInfo *, Loop *,
|
||||
AliasSetTracker *, LICMSafetyInfo *);
|
||||
|
||||
/// \brief Try to promote memory values to scalars by sinking stores out of
|
||||
/// the loop and moving loads to before the loop. We do this by looping over
|
||||
/// the stores in the loop, looking for stores to Must pointers which are
|
||||
/// loop invariant. It takes AliasSet, Loop exit blocks vector, loop exit blocks
|
||||
/// insertion point vector, PredIteratorCache, LoopInfo, DominatorTree, Loop,
|
||||
/// AliasSet information for all instructions of the loop and loop safety
|
||||
/// information as arguments. It returns changed status.
|
||||
bool promoteLoopAccessesToScalars(AliasSet &, SmallVectorImpl<BasicBlock*> &,
|
||||
SmallVectorImpl<Instruction*> &,
|
||||
PredIteratorCache &, LoopInfo *,
|
||||
DominatorTree *, Loop *, AliasSetTracker *,
|
||||
LICMSafetyInfo *);
|
||||
|
||||
/// \brief Computes safety information for a loop
|
||||
/// checks loop body & header for the possiblity of may throw
|
||||
/// exception, it takes LICMSafetyInfo and loop as argument.
|
||||
/// Updates safety information in LICMSafetyInfo argument.
|
||||
void computeLICMSafetyInfo(LICMSafetyInfo *, Loop *);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user