diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index cf02ef1e83f3..e370f8c34809 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -3885,8 +3885,8 @@ void LSRInstance::GenerateICmpZeroScales(LSRUse &LU, unsigned LUIdx, // Check that the multiplication doesn't overflow. if (Base.BaseOffset == std::numeric_limits::min() && Factor == -1) continue; - int64_t NewBaseOffset = (uint64_t)Base.BaseOffset * Factor; - if (NewBaseOffset / Factor != Base.BaseOffset) + int64_t NewBaseOffset; + if(__builtin_mul_overflow(Base.BaseOffset, Factor, &NewBaseOffset)) continue; // If the offset will be truncated at this use, check that it is in bounds. if (!IntTy->isPointerTy() && @@ -3897,8 +3897,7 @@ void LSRInstance::GenerateICmpZeroScales(LSRUse &LU, unsigned LUIdx, int64_t Offset = LU.MinOffset; if (Offset == std::numeric_limits::min() && Factor == -1) continue; - Offset = (uint64_t)Offset * Factor; - if (Offset / Factor != LU.MinOffset) + if(__builtin_mul_overflow(Offset, Factor, &Offset)) continue; // If the offset will be truncated at this use, check that it is in bounds. if (!IntTy->isPointerTy() &&