diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 18 | 
1 files changed, 13 insertions, 5 deletions
| diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 246de56d9ad..14cb9793925 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1417,11 +1417,19 @@ static unsigned getScalingFactorCost(const TargetTransformInfo &TTI,    switch (LU.Kind) {    case LSRUse::Address: { -    int CurScaleCost = TTI.getScalingFactorCost(LU.AccessTy, F.BaseGV, -                                                F.BaseOffset, F.HasBaseReg, -                                                F.Scale); -    assert(CurScaleCost >= 0 && "Legal addressing mode has an illegal cost!"); -    return CurScaleCost; +    // Check the scaling factor cost with both the min and max offsets. +    int ScaleCostMinOffset = +      TTI.getScalingFactorCost(LU.AccessTy, F.BaseGV, +                               F.BaseOffset + LU.MinOffset, +                               F.HasBaseReg, F.Scale); +    int ScaleCostMaxOffset = +      TTI.getScalingFactorCost(LU.AccessTy, F.BaseGV, +                               F.BaseOffset + LU.MaxOffset, +                               F.HasBaseReg, F.Scale); + +    assert(ScaleCostMinOffset >= 0 && ScaleCostMaxOffset >= 0 && +           "Legal addressing mode has an illegal cost!"); +    return std::max(ScaleCostMinOffset, ScaleCostMaxOffset);    }    case LSRUse::ICmpZero:      // ICmpZero BaseReg + -1*ScaleReg => ICmp BaseReg, ScaleReg. | 

