mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
[IndVars] Don't repeat function names in comment; NFC.
Only changes comments. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248112 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
28cce2ad25
commit
115bb95e68
@ -160,10 +160,10 @@ Pass *llvm::createIndVarSimplifyPass() {
|
||||
return new IndVarSimplify();
|
||||
}
|
||||
|
||||
/// isValidRewrite - Return true if the SCEV expansion generated by the
|
||||
/// rewriter can replace the original value. SCEV guarantees that it
|
||||
/// produces the same value, but the way it is produced may be illegal IR.
|
||||
/// Ideally, this function will only be called for verification.
|
||||
/// Return true if the SCEV expansion generated by the rewriter can replace the
|
||||
/// original value. SCEV guarantees that it produces the same value, but the way
|
||||
/// it is produced may be illegal IR. Ideally, this function will only be
|
||||
/// called for verification.
|
||||
bool IndVarSimplify::isValidRewrite(Value *FromVal, Value *ToVal) {
|
||||
// If an SCEV expression subsumed multiple pointers, its expansion could
|
||||
// reassociate the GEP changing the base pointer. This is illegal because the
|
||||
@ -246,7 +246,7 @@ static Instruction *getInsertPointForUses(Instruction *User, Value *Def,
|
||||
// RewriteNonIntegerIVs and helpers. Prefer integer IVs.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// ConvertToSInt - Convert APF to an integer, if possible.
|
||||
/// Convert APF to an integer, if possible.
|
||||
static bool ConvertToSInt(const APFloat &APF, int64_t &IntVal) {
|
||||
bool isExact = false;
|
||||
// See if we can convert this to an int64_t
|
||||
@ -258,8 +258,8 @@ static bool ConvertToSInt(const APFloat &APF, int64_t &IntVal) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// HandleFloatingPointIV - If the loop has floating induction variable
|
||||
/// then insert corresponding integer induction variable if possible.
|
||||
/// If the loop has floating induction variable then insert corresponding
|
||||
/// integer induction variable if possible.
|
||||
/// For example,
|
||||
/// for(double i = 0; i < 10000; ++i)
|
||||
/// bar(i)
|
||||
@ -521,11 +521,11 @@ Value *IndVarSimplify::ExpandSCEVIfNeeded(SCEVExpander &Rewriter, const SCEV *S,
|
||||
// As a side effect, reduces the amount of IV processing within the loop.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// RewriteLoopExitValues - Check to see if this loop has a computable
|
||||
/// loop-invariant execution count. If so, this means that we can compute the
|
||||
/// final value of any expressions that are recurrent in the loop, and
|
||||
/// substitute the exit values from the loop into any instructions outside of
|
||||
/// the loop that use the final values of the current expressions.
|
||||
/// Check to see if this loop has a computable loop-invariant execution count.
|
||||
/// If so, this means that we can compute the final value of any expressions
|
||||
/// that are recurrent in the loop, and substitute the exit values from the loop
|
||||
/// into any instructions outside of the loop that use the final values of the
|
||||
/// current expressions.
|
||||
///
|
||||
/// This is mostly redundant with the regular IndVarSimplify activities that
|
||||
/// happen later, except that it's more powerful in some cases, because it's
|
||||
@ -704,9 +704,9 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) {
|
||||
Rewriter.clearInsertPoint();
|
||||
}
|
||||
|
||||
/// CanLoopBeDeleted - Check whether it is possible to delete the loop after
|
||||
/// rewriting exit value. If it is possible, ignore ReplaceExitValue and
|
||||
/// do rewriting aggressively.
|
||||
/// Check whether it is possible to delete the loop after rewriting exit
|
||||
/// value. If it is possible, ignore ReplaceExitValue and do rewriting
|
||||
/// aggressively.
|
||||
bool IndVarSimplify::CanLoopBeDeleted(
|
||||
Loop *L, SmallVector<RewritePhi, 8> &RewritePhiSet) {
|
||||
|
||||
@ -781,9 +781,9 @@ namespace {
|
||||
};
|
||||
}
|
||||
|
||||
/// visitCast - Update information about the induction variable that is
|
||||
/// extended by this sign or zero extend operation. This is used to determine
|
||||
/// the final width of the IV before actually widening it.
|
||||
/// Update information about the induction variable that is extended by this
|
||||
/// sign or zero extend operation. This is used to determine the final width of
|
||||
/// the IV before actually widening it.
|
||||
static void visitIVCast(CastInst *Cast, WideIVInfo &WI, ScalarEvolution *SE,
|
||||
const TargetTransformInfo *TTI) {
|
||||
bool IsSigned = Cast->getOpcode() == Instruction::SExt;
|
||||
@ -824,9 +824,9 @@ static void visitIVCast(CastInst *Cast, WideIVInfo &WI, ScalarEvolution *SE,
|
||||
|
||||
namespace {
|
||||
|
||||
/// NarrowIVDefUse - Record a link in the Narrow IV def-use chain along with the
|
||||
/// WideIV that computes the same value as the Narrow IV def. This avoids
|
||||
/// caching Use* pointers.
|
||||
/// Record a link in the Narrow IV def-use chain along with the WideIV that
|
||||
/// computes the same value as the Narrow IV def. This avoids caching Use*
|
||||
/// pointers.
|
||||
struct NarrowIVDefUse {
|
||||
Instruction *NarrowDef;
|
||||
Instruction *NarrowUse;
|
||||
@ -847,10 +847,10 @@ struct NarrowIVDefUse {
|
||||
NeverNegative(NeverNegative) {}
|
||||
};
|
||||
|
||||
/// WidenIV - The goal of this transform is to remove sign and zero extends
|
||||
/// without creating any new induction variables. To do this, it creates a new
|
||||
/// phi of the wider type and redirects all users, either removing extends or
|
||||
/// inserting truncs whenever we stop propagating the type.
|
||||
/// The goal of this transform is to remove sign and zero extends without
|
||||
/// creating any new induction variables. To do this, it creates a new phi of
|
||||
/// the wider type and redirects all users, either removing extends or inserting
|
||||
/// truncs whenever we stop propagating the type.
|
||||
///
|
||||
class WidenIV {
|
||||
// Parameters
|
||||
@ -914,9 +914,9 @@ protected:
|
||||
};
|
||||
} // anonymous namespace
|
||||
|
||||
/// isLoopInvariant - Perform a quick domtree based check for loop invariance
|
||||
/// assuming that V is used within the loop. LoopInfo::isLoopInvariant() seems
|
||||
/// gratuitous for this purpose.
|
||||
/// Perform a quick domtree based check for loop invariance assuming that V is
|
||||
/// used within the loop. LoopInfo::isLoopInvariant() seems gratuitous for this
|
||||
/// purpose.
|
||||
static bool isLoopInvariant(Value *V, const Loop *L, const DominatorTree *DT) {
|
||||
Instruction *Inst = dyn_cast<Instruction>(V);
|
||||
if (!Inst)
|
||||
@ -939,9 +939,9 @@ Value *WidenIV::getExtend(Value *NarrowOper, Type *WideType, bool IsSigned,
|
||||
Builder.CreateZExt(NarrowOper, WideType);
|
||||
}
|
||||
|
||||
/// CloneIVUser - Instantiate a wide operation to replace a narrow
|
||||
/// operation. This only needs to handle operations that can evaluation to
|
||||
/// SCEVAddRec. It can safely return 0 for any operation we decide not to clone.
|
||||
/// Instantiate a wide operation to replace a narrow operation. This only needs
|
||||
/// to handle operations that can evaluation to SCEVAddRec. It can safely return
|
||||
/// 0 for any operation we decide not to clone.
|
||||
Instruction *WidenIV::CloneIVUser(NarrowIVDefUse DU) {
|
||||
unsigned Opcode = DU.NarrowUse->getOpcode();
|
||||
switch (Opcode) {
|
||||
@ -1047,11 +1047,10 @@ const SCEVAddRecExpr* WidenIV::GetExtendedOperandRecurrence(NarrowIVDefUse DU) {
|
||||
return AddRec;
|
||||
}
|
||||
|
||||
/// GetWideRecurrence - Is this instruction potentially interesting for further
|
||||
/// simplification after widening it's type? In other words, can the
|
||||
/// extend be safely hoisted out of the loop with SCEV reducing the value to a
|
||||
/// recurrence on the same loop. If so, return the sign or zero extended
|
||||
/// recurrence. Otherwise return NULL.
|
||||
/// Is this instruction potentially interesting for further simplification after
|
||||
/// widening it's type? In other words, can the extend be safely hoisted out of
|
||||
/// the loop with SCEV reducing the value to a recurrence on the same loop. If
|
||||
/// so, return the sign or zero extended recurrence. Otherwise return NULL.
|
||||
const SCEVAddRecExpr *WidenIV::GetWideRecurrence(Instruction *NarrowUse) {
|
||||
if (!SE->isSCEVable(NarrowUse->getType()))
|
||||
return nullptr;
|
||||
@ -1126,8 +1125,8 @@ bool WidenIV::WidenLoopCompare(NarrowIVDefUse DU) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// WidenIVUse - Determine whether an individual user of the narrow IV can be
|
||||
/// widened. If so, return the wide clone of the user.
|
||||
/// Determine whether an individual user of the narrow IV can be widened. If so,
|
||||
/// return the wide clone of the user.
|
||||
Instruction *WidenIV::WidenIVUse(NarrowIVDefUse DU, SCEVExpander &Rewriter) {
|
||||
|
||||
// Stop traversing the def-use chain at inner-loop phis or post-loop phis.
|
||||
@ -1240,7 +1239,7 @@ Instruction *WidenIV::WidenIVUse(NarrowIVDefUse DU, SCEVExpander &Rewriter) {
|
||||
return WideUse;
|
||||
}
|
||||
|
||||
/// pushNarrowIVUsers - Add eligible users of NarrowDef to NarrowIVUsers.
|
||||
/// Add eligible users of NarrowDef to NarrowIVUsers.
|
||||
///
|
||||
void WidenIV::pushNarrowIVUsers(Instruction *NarrowDef, Instruction *WideDef) {
|
||||
const SCEV *NarrowSCEV = SE->getSCEV(NarrowDef);
|
||||
@ -1259,12 +1258,11 @@ void WidenIV::pushNarrowIVUsers(Instruction *NarrowDef, Instruction *WideDef) {
|
||||
}
|
||||
}
|
||||
|
||||
/// CreateWideIV - Process a single induction variable. First use the
|
||||
/// SCEVExpander to create a wide induction variable that evaluates to the same
|
||||
/// recurrence as the original narrow IV. Then use a worklist to forward
|
||||
/// traverse the narrow IV's def-use chain. After WidenIVUse has processed all
|
||||
/// interesting IV users, the narrow IV will be isolated for removal by
|
||||
/// DeleteDeadPHIs.
|
||||
/// Process a single induction variable. First use the SCEVExpander to create a
|
||||
/// wide induction variable that evaluates to the same recurrence as the
|
||||
/// original narrow IV. Then use a worklist to forward traverse the narrow IV's
|
||||
/// def-use chain. After WidenIVUse has processed all interesting IV users, the
|
||||
/// narrow IV will be isolated for removal by DeleteDeadPHIs.
|
||||
///
|
||||
/// It would be simpler to delete uses as they are processed, but we must avoid
|
||||
/// invalidating SCEV expressions.
|
||||
@ -1372,9 +1370,9 @@ namespace {
|
||||
};
|
||||
}
|
||||
|
||||
/// SimplifyAndExtend - Iteratively perform simplification on a worklist of IV
|
||||
/// users. Each successive simplification may push more users which may
|
||||
/// themselves be candidates for simplification.
|
||||
/// Iteratively perform simplification on a worklist of IV users. Each
|
||||
/// successive simplification may push more users which may themselves be
|
||||
/// candidates for simplification.
|
||||
///
|
||||
/// Sign/Zero extend elimination is interleaved with IV simplification.
|
||||
///
|
||||
@ -1425,9 +1423,9 @@ void IndVarSimplify::SimplifyAndExtend(Loop *L,
|
||||
// LinearFunctionTestReplace and its kin. Rewrite the loop exit condition.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// canExpandBackedgeTakenCount - Return true if this loop's backedge taken
|
||||
/// count expression can be safely and cheaply expanded into an instruction
|
||||
/// sequence that can be used by LinearFunctionTestReplace.
|
||||
/// Return true if this loop's backedge taken count expression can be safely and
|
||||
/// cheaply expanded into an instruction sequence that can be used by
|
||||
/// LinearFunctionTestReplace.
|
||||
///
|
||||
/// TODO: This fails for pointer-type loop counters with greater than one byte
|
||||
/// strides, consequently preventing LFTR from running. For the purpose of LFTR
|
||||
@ -1458,8 +1456,7 @@ static bool canExpandBackedgeTakenCount(Loop *L, ScalarEvolution *SE,
|
||||
return true;
|
||||
}
|
||||
|
||||
/// getLoopPhiForCounter - Return the loop header phi IFF IncV adds a loop
|
||||
/// invariant value to the phi.
|
||||
/// Return the loop header phi IFF IncV adds a loop invariant value to the phi.
|
||||
static PHINode *getLoopPhiForCounter(Value *IncV, Loop *L, DominatorTree *DT) {
|
||||
Instruction *IncI = dyn_cast<Instruction>(IncV);
|
||||
if (!IncI)
|
||||
@ -1510,8 +1507,8 @@ static ICmpInst *getLoopTest(Loop *L) {
|
||||
return dyn_cast<ICmpInst>(BI->getCondition());
|
||||
}
|
||||
|
||||
/// needsLFTR - LinearFunctionTestReplace policy. Return true unless we can show
|
||||
/// that the current exit test is already sufficiently canonical.
|
||||
/// LinearFunctionTestReplace policy. Return true unless we can show that the
|
||||
/// current exit test is already sufficiently canonical.
|
||||
static bool needsLFTR(Loop *L, DominatorTree *DT) {
|
||||
// Do LFTR to simplify the exit condition to an ICMP.
|
||||
ICmpInst *Cond = getLoopTest(L);
|
||||
@ -1591,8 +1588,8 @@ static bool hasConcreteDef(Value *V) {
|
||||
return hasConcreteDefImpl(V, Visited, 0);
|
||||
}
|
||||
|
||||
/// AlmostDeadIV - Return true if this IV has any uses other than the (soon to
|
||||
/// be rewritten) loop exit test.
|
||||
/// Return true if this IV has any uses other than the (soon to be rewritten)
|
||||
/// loop exit test.
|
||||
static bool AlmostDeadIV(PHINode *Phi, BasicBlock *LatchBlock, Value *Cond) {
|
||||
int LatchIdx = Phi->getBasicBlockIndex(LatchBlock);
|
||||
Value *IncV = Phi->getIncomingValue(LatchIdx);
|
||||
@ -1605,7 +1602,7 @@ static bool AlmostDeadIV(PHINode *Phi, BasicBlock *LatchBlock, Value *Cond) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// FindLoopCounter - Find an affine IV in canonical form.
|
||||
/// Find an affine IV in canonical form.
|
||||
///
|
||||
/// BECount may be an i8* pointer type. The pointer difference is already
|
||||
/// valid count without scaling the address stride, so it remains a pointer
|
||||
@ -1699,8 +1696,8 @@ static PHINode *FindLoopCounter(Loop *L, const SCEV *BECount,
|
||||
return BestPhi;
|
||||
}
|
||||
|
||||
/// genLoopLimit - Help LinearFunctionTestReplace by generating a value that
|
||||
/// holds the RHS of the new loop test.
|
||||
/// Help LinearFunctionTestReplace by generating a value that holds the RHS of
|
||||
/// the new loop test.
|
||||
static Value *genLoopLimit(PHINode *IndVar, const SCEV *IVCount, Loop *L,
|
||||
SCEVExpander &Rewriter, ScalarEvolution *SE) {
|
||||
const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(SE->getSCEV(IndVar));
|
||||
@ -1782,11 +1779,11 @@ static Value *genLoopLimit(PHINode *IndVar, const SCEV *IVCount, Loop *L,
|
||||
}
|
||||
}
|
||||
|
||||
/// LinearFunctionTestReplace - This method rewrites the exit condition of the
|
||||
/// loop to be a canonical != comparison against the incremented loop induction
|
||||
/// variable. This pass is able to rewrite the exit tests of any loop where the
|
||||
/// SCEV analysis can determine a loop-invariant trip count of the loop, which
|
||||
/// is actually a much broader range than just linear tests.
|
||||
/// This method rewrites the exit condition of the loop to be a canonical !=
|
||||
/// comparison against the incremented loop induction variable. This pass is
|
||||
/// able to rewrite the exit tests of any loop where the SCEV analysis can
|
||||
/// determine a loop-invariant trip count of the loop, which is actually a much
|
||||
/// broader range than just linear tests.
|
||||
Value *IndVarSimplify::
|
||||
LinearFunctionTestReplace(Loop *L,
|
||||
const SCEV *BackedgeTakenCount,
|
||||
|
Loading…
Reference in New Issue
Block a user