Changes in directory llvm/lib/Transforms/Scalar:
LoopStrengthReduce.cpp updated: 1.79 -> 1.80 --- Log message: - Fixed a bogus if condition. - Added more debugging info. - Allow reuse of IV of negative stride. e.g. -4 stride == 2 * iv of -2 stride. --- Diffs of the changes: (+25 -19) LoopStrengthReduce.cpp | 44 +++++++++++++++++++++++++------------------- 1 files changed, 25 insertions(+), 19 deletions(-) Index: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp diff -u llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.79 llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.80 --- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.79 Fri Mar 17 18:44:49 2006 +++ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp Sat Mar 18 02:03:12 2006 @@ -77,15 +77,20 @@ }; /// IVInfo - This structure keeps track of one IV expression inserted during - /// StrengthReduceStridedIVUsers. It contains the base value, as well as the - /// PHI node and increment value created for rewrite. + /// StrengthReduceStridedIVUsers. It contains the stride, the common base, as + /// well as the PHI node and increment value created for rewrite. struct IVExpr { + SCEVHandle Stride; SCEVHandle Base; PHINode *PHI; Value *IncV; - IVExpr(const SCEVHandle &base, PHINode *phi, Value *incv) - : Base(base), PHI(phi), IncV(incv) {} + IVExpr() + : Stride(SCEVUnknown::getIntegerSCEV(0, Type::UIntTy)), + Base (SCEVUnknown::getIntegerSCEV(0, Type::UIntTy)) {} + IVExpr(const SCEVHandle &stride, const SCEVHandle &base, PHINode *phi, + Value *incv) + : Stride(stride), Base(base), PHI(phi), IncV(incv) {} }; /// IVsOfOneStride - This structure keeps track of all IV expression inserted @@ -93,8 +98,9 @@ struct IVsOfOneStride { std::vector<IVExpr> IVs; - void addIV(const SCEVHandle &Base, PHINode *PHI, Value *IncV) { - IVs.push_back(IVExpr(Base, PHI, IncV)); + void addIV(const SCEVHandle &Stride, const SCEVHandle &Base, PHINode *PHI, + Value *IncV) { + IVs.push_back(IVExpr(Stride, Base, PHI, IncV)); } }; @@ -863,22 +869,20 @@ /// CheckForIVReuse - Returns the multiple if the stride is the multiple /// of a previous stride and it is a legal value for the target addressing /// mode scale component. This allows the users of this stride to be rewritten -/// as prev iv * factor. It returns 1 if no reuse is possible. +/// as prev iv * factor. It returns 0 if no reuse is possible. unsigned LoopStrengthReduce::CheckForIVReuse(const SCEVHandle &Stride, IVExpr &IV) { - if (!TLI) - return 1; + if (!TLI) return 0; if (SCEVConstant *SC = dyn_cast<SCEVConstant>(Stride)) { - unsigned SInt = SC->getValue()->getRawValue(); - if (SInt == 1) - return 1; + int64_t SInt = SC->getValue()->getSExtValue(); + if (SInt == 1) return 0; for (TargetLowering::legal_am_scale_iterator I = TLI->legal_am_scale_begin(), E = TLI->legal_am_scale_end(); I != E; ++I) { unsigned Scale = *I; - if (SInt >= Scale && (SInt % Scale) != 0) + if (abs(SInt) < Scale || (SInt % Scale) != 0) continue; std::map<SCEVHandle, IVsOfOneStride>::iterator SI = IVsByStride.find(SCEVUnknown::getIntegerSCEV(SInt/Scale, Type::UIntTy)); @@ -894,7 +898,7 @@ } } - return 1; + return 0; } @@ -929,9 +933,11 @@ // field of the target addressing mode. PHINode *NewPHI = NULL; Value *IncV = NULL; - IVExpr ReuseIV(Stride, NULL, NULL); + IVExpr ReuseIV; unsigned RewriteFactor = CheckForIVReuse(Stride, ReuseIV); - if (RewriteFactor > 1) { + if (RewriteFactor != 0) { + DEBUG(std::cerr << "BASED ON IV of STRIDE " << *ReuseIV.Stride + << " and BASE " << *ReuseIV.Base << " :\n"); NewPHI = ReuseIV.PHI; IncV = ReuseIV.IncV; } @@ -994,7 +1000,7 @@ = PreheaderRewriter.expandCodeFor(CommonExprs, PreInsertPt, ReplacedTy); - if (RewriteFactor == 1) { + if (RewriteFactor == 0) { // Create a new Phi for this base, and stick it in the loop header. NewPHI = new PHINode(ReplacedTy, "iv.", PhiInsertBefore); ++NumInserted; @@ -1018,7 +1024,7 @@ NewPHI->addIncoming(IncV, LatchBlock); // Remember this in case a later stride is multiple of this. - IVsByStride[Stride].addIV(CommonExprs, NewPHI, IncV); + IVsByStride[Stride].addIV(Stride, CommonExprs, NewPHI, IncV); } else { Constant *C = dyn_cast<Constant>(CommonBaseV); if (!C || @@ -1076,7 +1082,7 @@ // If we are reusing the iv, then it must be multiplied by a constant // factor take advantage of addressing mode scale component. - if (RewriteFactor != 1) { + if (RewriteFactor != 0) { RewriteExpr = SCEVMulExpr::get(SCEVUnknown::getIntegerSCEV(RewriteFactor, RewriteExpr->getType()), _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits