Changes in directory llvm/lib/Transforms/Scalar:
LoopStrengthReduce.cpp updated: 1.127 -> 1.128 --- Log message: switch LSR to use isLegalAddressingMode instead of other simpler hooks --- Diffs of the changes: (+21 -18) LoopStrengthReduce.cpp | 39 +++++++++++++++++++++------------------ 1 files changed, 21 insertions(+), 18 deletions(-) Index: llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp diff -u llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.127 llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.128 --- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp:1.127 Sat Apr 7 02:17:27 2007 +++ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp Mon Apr 9 17:20:14 2007 @@ -143,8 +143,7 @@ const TargetLowering *TLI; public: - LoopStrengthReduce(const TargetLowering *tli = NULL) - : TLI(tli) { + LoopStrengthReduce(const TargetLowering *tli = NULL) : TLI(tli) { } bool runOnLoop(Loop *L, LPPassManager &LPM); @@ -631,20 +630,25 @@ const TargetLowering *TLI) { if (SCEVConstant *SC = dyn_cast<SCEVConstant>(V)) { int64_t VC = SC->getValue()->getSExtValue(); - if (TLI) - return TLI->isLegalAddressImmediate(VC, UseTy); - else + if (TLI) { + TargetLowering::AddrMode AM; + AM.BaseOffs = VC; + return TLI->isLegalAddressingMode(AM, UseTy); + } else { // Defaults to PPC. PPC allows a sign-extended 16-bit immediate field. return (VC > -(1 << 16) && VC < (1 << 16)-1); + } } if (SCEVUnknown *SU = dyn_cast<SCEVUnknown>(V)) if (ConstantExpr *CE = dyn_cast<ConstantExpr>(SU->getValue())) - if (CE->getOpcode() == Instruction::PtrToInt) { + if (TLI && CE->getOpcode() == Instruction::PtrToInt) { Constant *Op0 = CE->getOperand(0); - if (isa<GlobalValue>(Op0) && TLI && - TLI->isLegalAddressImmediate(cast<GlobalValue>(Op0))) - return true; + if (GlobalValue *GV = dyn_cast<GlobalValue>(Op0)) { + TargetLowering::AddrMode AM; + AM.BaseGV = GV; + return TLI->isLegalAddressingMode(AM, UseTy); + } } return false; } @@ -889,18 +893,11 @@ } /// ValidStride - Check whether the given Scale is valid for all loads and -/// stores in UsersToProcess. Pulled into a function to avoid disturbing the -/// sensibilities of those who dislike goto's. +/// stores in UsersToProcess. /// bool LoopStrengthReduce::ValidStride(int64_t Scale, const std::vector<BasedUser>& UsersToProcess) { - int64_t Imm; for (unsigned i=0, e = UsersToProcess.size(); i!=e; ++i) { - if (SCEVConstant *SC = dyn_cast<SCEVConstant>(UsersToProcess[i].Imm)) - Imm = SC->getValue()->getSExtValue(); - else - Imm = 0; - // If this is a load or other access, pass the type of the access in. const Type *AccessTy = Type::VoidTy; if (StoreInst *SI = dyn_cast<StoreInst>(UsersToProcess[i].Inst)) @@ -908,7 +905,13 @@ else if (LoadInst *LI = dyn_cast<LoadInst>(UsersToProcess[i].Inst)) AccessTy = LI->getType(); - if (!TLI->isLegalAddressScaleAndImm(Scale, Imm, AccessTy)) + TargetLowering::AddrMode AM; + if (SCEVConstant *SC = dyn_cast<SCEVConstant>(UsersToProcess[i].Imm)) + AM.BaseOffs = SC->getValue()->getSExtValue(); + AM.Scale = Scale; + + // If load[imm+r*scale] is illegal, bail out. + if (!TLI->isLegalAddressingMode(AM, AccessTy)) return false; } return true; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits