diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2019-04-11 21:10:33 +0000 | 
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-04-11 21:10:33 +0000 | 
| commit | e319eafb20815d3773c78655819fc2355b2b9123 (patch) | |
| tree | 803ff2a5648d68a60df3444161aa7f6ade1f9740 /llvm/lib/IR | |
| parent | db615bb313bf639693fac295843f06739bca459c (diff) | |
| download | bcm5719-llvm-e319eafb20815d3773c78655819fc2355b2b9123.tar.gz bcm5719-llvm-e319eafb20815d3773c78655819fc2355b2b9123.zip  | |
[ConstantRange] Add unsignedMulMayOverflow()
Same as the other ConstantRange overflow checking methods, but for
unsigned mul. In this case there is no cheap overflow criterion, so
using umul_ov for the implementation.
Differential Revision: https://reviews.llvm.org/D60574
llvm-svn: 358228
Diffstat (limited to 'llvm/lib/IR')
| -rw-r--r-- | llvm/lib/IR/ConstantRange.cpp | 20 | 
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/IR/ConstantRange.cpp b/llvm/lib/IR/ConstantRange.cpp index 391d9653db5..35c2b0e2e2c 100644 --- a/llvm/lib/IR/ConstantRange.cpp +++ b/llvm/lib/IR/ConstantRange.cpp @@ -1252,6 +1252,26 @@ ConstantRange::OverflowResult ConstantRange::signedSubMayOverflow(    return OverflowResult::NeverOverflows;  } +ConstantRange::OverflowResult ConstantRange::unsignedMulMayOverflow( +    const ConstantRange &Other) const { +  if (isEmptySet() || Other.isEmptySet()) +    return OverflowResult::MayOverflow; + +  APInt Min = getUnsignedMin(), Max = getUnsignedMax(); +  APInt OtherMin = Other.getUnsignedMin(), OtherMax = Other.getUnsignedMax(); +  bool Overflow; + +  (void) Min.umul_ov(OtherMin, Overflow); +  if (Overflow) +    return OverflowResult::AlwaysOverflows; + +  (void) Max.umul_ov(OtherMax, Overflow); +  if (Overflow) +    return OverflowResult::MayOverflow; + +  return OverflowResult::NeverOverflows; +} +  void ConstantRange::print(raw_ostream &OS) const {    if (isFullSet())      OS << "full-set";  | 

