diff options
author | Andrew Trick <atrick@apple.com> | 2014-01-02 21:12:11 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2014-01-02 21:12:11 +0000 |
commit | 5f8e79e6d22cff558fde9f3d40844a9eceaf79ac (patch) | |
tree | f8559ddc38a5a0222e4ad1d9db1a6ec5ad21c993 /lib/Transforms/Scalar | |
parent | daf7c149e4ee76e9be777b5a6fba06f25cbb0203 (diff) | |
download | llvm-5f8e79e6d22cff558fde9f3d40844a9eceaf79ac.tar.gz llvm-5f8e79e6d22cff558fde9f3d40844a9eceaf79ac.tar.bz2 llvm-5f8e79e6d22cff558fde9f3d40844a9eceaf79ac.tar.xz |
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
Diffstat (limited to 'lib/Transforms/Scalar')
-rw-r--r-- | lib/Transforms/Scalar/IndVarSimplify.cpp | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index c992f8c12a..6e141bd2d6 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -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; @@ -1093,9 +1076,36 @@ PHINode *WidenIV::CreateWideIV(SCEVExpander &Rewriter) { } //===----------------------------------------------------------------------===// +// 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()); |