mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-02 16:21:36 +00:00
[SCEV] Extract out a helper function; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284500 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
acea2a6695
commit
9d4955cdc5
@ -448,6 +448,51 @@ bool SCEVUnknown::isOffsetOf(Type *&CTy, Constant *&FieldNo) const {
|
||||
// SCEV Utilities
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
static int CompareValueComplexity(const LoopInfo *const LI, Value *LV,
|
||||
Value *RV) {
|
||||
// Order pointer values after integer values. This helps SCEVExpander form
|
||||
// GEPs.
|
||||
bool LIsPointer = LV->getType()->isPointerTy(),
|
||||
RIsPointer = RV->getType()->isPointerTy();
|
||||
if (LIsPointer != RIsPointer)
|
||||
return (int)LIsPointer - (int)RIsPointer;
|
||||
|
||||
// Compare getValueID values.
|
||||
unsigned LID = LV->getValueID(), RID = RV->getValueID();
|
||||
if (LID != RID)
|
||||
return (int)LID - (int)RID;
|
||||
|
||||
// Sort arguments by their position.
|
||||
if (const Argument *LA = dyn_cast<Argument>(LV)) {
|
||||
const Argument *RA = cast<Argument>(RV);
|
||||
unsigned LArgNo = LA->getArgNo(), RArgNo = RA->getArgNo();
|
||||
return (int)LArgNo - (int)RArgNo;
|
||||
}
|
||||
|
||||
// For instructions, compare their loop depth, and their operand count. This
|
||||
// is pretty loose.
|
||||
if (const Instruction *LInst = dyn_cast<Instruction>(LV)) {
|
||||
const Instruction *RInst = cast<Instruction>(RV);
|
||||
|
||||
// Compare loop depths.
|
||||
const BasicBlock *LParent = LInst->getParent(),
|
||||
*RParent = RInst->getParent();
|
||||
if (LParent != RParent) {
|
||||
unsigned LDepth = LI->getLoopDepth(LParent),
|
||||
RDepth = LI->getLoopDepth(RParent);
|
||||
if (LDepth != RDepth)
|
||||
return (int)LDepth - (int)RDepth;
|
||||
}
|
||||
|
||||
// Compare the number of operands.
|
||||
unsigned LNumOps = LInst->getNumOperands(),
|
||||
RNumOps = RInst->getNumOperands();
|
||||
return (int)LNumOps - (int)RNumOps;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Return negative, zero, or positive, if LHS is less than, equal to, or greater
|
||||
// than RHS, respectively. A three-way result allows recursive comparisons to be
|
||||
// more efficient.
|
||||
@ -470,51 +515,7 @@ static int CompareSCEVComplexity(const LoopInfo *const LI, const SCEV *LHS,
|
||||
const SCEVUnknown *LU = cast<SCEVUnknown>(LHS);
|
||||
const SCEVUnknown *RU = cast<SCEVUnknown>(RHS);
|
||||
|
||||
// Sort SCEVUnknown values with some loose heuristics. TODO: This is
|
||||
// not as complete as it could be.
|
||||
const Value *LV = LU->getValue(), *RV = RU->getValue();
|
||||
|
||||
// Order pointer values after integer values. This helps SCEVExpander
|
||||
// form GEPs.
|
||||
bool LIsPointer = LV->getType()->isPointerTy(),
|
||||
RIsPointer = RV->getType()->isPointerTy();
|
||||
if (LIsPointer != RIsPointer)
|
||||
return (int)LIsPointer - (int)RIsPointer;
|
||||
|
||||
// Compare getValueID values.
|
||||
unsigned LID = LV->getValueID(), RID = RV->getValueID();
|
||||
if (LID != RID)
|
||||
return (int)LID - (int)RID;
|
||||
|
||||
// Sort arguments by their position.
|
||||
if (const Argument *LA = dyn_cast<Argument>(LV)) {
|
||||
const Argument *RA = cast<Argument>(RV);
|
||||
unsigned LArgNo = LA->getArgNo(), RArgNo = RA->getArgNo();
|
||||
return (int)LArgNo - (int)RArgNo;
|
||||
}
|
||||
|
||||
// For instructions, compare their loop depth, and their operand
|
||||
// count. This is pretty loose.
|
||||
if (const Instruction *LInst = dyn_cast<Instruction>(LV)) {
|
||||
const Instruction *RInst = cast<Instruction>(RV);
|
||||
|
||||
// Compare loop depths.
|
||||
const BasicBlock *LParent = LInst->getParent(),
|
||||
*RParent = RInst->getParent();
|
||||
if (LParent != RParent) {
|
||||
unsigned LDepth = LI->getLoopDepth(LParent),
|
||||
RDepth = LI->getLoopDepth(RParent);
|
||||
if (LDepth != RDepth)
|
||||
return (int)LDepth - (int)RDepth;
|
||||
}
|
||||
|
||||
// Compare the number of operands.
|
||||
unsigned LNumOps = LInst->getNumOperands(),
|
||||
RNumOps = RInst->getNumOperands();
|
||||
return (int)LNumOps - (int)RNumOps;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return CompareValueComplexity(LI, LU->getValue(), RU->getValue());
|
||||
}
|
||||
|
||||
case scConstant: {
|
||||
|
Loading…
x
Reference in New Issue
Block a user