mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
indvars: cleanup the IV visitor. It does more than gather sext/zext info.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198353 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
daf7c149e4
commit
5f8e79e6d2
@ -637,30 +637,13 @@ namespace {
|
||||
|
||||
WideIVInfo() : NarrowIV(0), WidestNativeType(0), IsSigned(false) {}
|
||||
};
|
||||
|
||||
class WideIVVisitor : public IVVisitor {
|
||||
ScalarEvolution *SE;
|
||||
const DataLayout *TD;
|
||||
|
||||
public:
|
||||
WideIVInfo WI;
|
||||
|
||||
WideIVVisitor(PHINode *NarrowIV, ScalarEvolution *SCEV,
|
||||
const DataLayout *TData, const DominatorTree *DTree):
|
||||
SE(SCEV), TD(TData) {
|
||||
DT = DTree;
|
||||
WI.NarrowIV = NarrowIV;
|
||||
}
|
||||
|
||||
// Implement the interface used by simplifyUsersOfIV.
|
||||
virtual void visitCast(CastInst *Cast);
|
||||
};
|
||||
}
|
||||
|
||||
/// 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.
|
||||
void WideIVVisitor::visitCast(CastInst *Cast) {
|
||||
static void visitIVCast(CastInst *Cast, WideIVInfo &WI, ScalarEvolution *SE,
|
||||
const DataLayout *TD) {
|
||||
bool IsSigned = Cast->getOpcode() == Instruction::SExt;
|
||||
if (!IsSigned && Cast->getOpcode() != Instruction::ZExt)
|
||||
return;
|
||||
@ -1092,10 +1075,37 @@ PHINode *WidenIV::CreateWideIV(SCEVExpander &Rewriter) {
|
||||
return WidePhi;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Live IV Reduction - Minimize IVs live across the loop.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Simplification of IV users based on SCEV evaluation.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace {
|
||||
class IndVarSimplifyVisitor : public IVVisitor {
|
||||
ScalarEvolution *SE;
|
||||
const DataLayout *TD;
|
||||
PHINode *IVPhi;
|
||||
|
||||
public:
|
||||
WideIVInfo WI;
|
||||
|
||||
IndVarSimplifyVisitor(PHINode *IV, ScalarEvolution *SCEV,
|
||||
const DataLayout *TData, const DominatorTree *DTree):
|
||||
SE(SCEV), TD(TData), IVPhi(IV) {
|
||||
DT = DTree;
|
||||
WI.NarrowIV = IVPhi;
|
||||
if (ReduceLiveIVs)
|
||||
setSplitOverflowIntrinsics();
|
||||
}
|
||||
|
||||
// Implement the interface used by simplifyUsersOfIV.
|
||||
virtual void visitCast(CastInst *Cast) { visitIVCast(Cast, WI, SE, TD); }
|
||||
};
|
||||
}
|
||||
|
||||
/// SimplifyAndExtend - Iteratively perform simplification on a worklist of IV
|
||||
/// users. Each successive simplification may push more users which may
|
||||
@ -1127,14 +1137,12 @@ void IndVarSimplify::SimplifyAndExtend(Loop *L,
|
||||
PHINode *CurrIV = LoopPhis.pop_back_val();
|
||||
|
||||
// Information about sign/zero extensions of CurrIV.
|
||||
WideIVVisitor WIV(CurrIV, SE, TD, DT);
|
||||
if (ReduceLiveIVs)
|
||||
WIV.setSplitOverflowIntrinsics();
|
||||
IndVarSimplifyVisitor Visitor(CurrIV, SE, TD, DT);
|
||||
|
||||
Changed |= simplifyUsersOfIV(CurrIV, SE, &LPM, DeadInsts, &WIV);
|
||||
Changed |= simplifyUsersOfIV(CurrIV, SE, &LPM, DeadInsts, &Visitor);
|
||||
|
||||
if (WIV.WI.WidestNativeType) {
|
||||
WideIVs.push_back(WIV.WI);
|
||||
if (Visitor.WI.WidestNativeType) {
|
||||
WideIVs.push_back(Visitor.WI);
|
||||
}
|
||||
} while(!LoopPhis.empty());
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user