diff options
author | Craig Topper <craig.topper@gmail.com> | 2017-05-07 22:22:11 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2017-05-07 22:22:11 +0000 |
commit | 7e3e7afca87f5bbd6ce416e483b26c36ea384ecf (patch) | |
tree | e9d095ff83c51b24797bc8f88026029997e02f29 | |
parent | cedc1ec3dc89abc5ea74389aaf5e12c3e333bf0d (diff) | |
download | bcm5719-llvm-7e3e7afca87f5bbd6ce416e483b26c36ea384ecf.tar.gz bcm5719-llvm-7e3e7afca87f5bbd6ce416e483b26c36ea384ecf.zip |
[ConstantRange][SimplifyCFG] Add a helper method to allow SimplifyCFG to determine if a ConstantRange has more than 8 elements without requiring an allocation if the ConstantRange is 64-bits wide.
Previously SimplifyCFG used getSetSize which returns an APInt that is 1 bit wider than the ConstantRange's bit width. In the reasonably common case that the ConstantRange is 64-bits wide, this requires returning a 65-bit APInt. APInt's can only store 64-bits without a memory allocation so this is inefficient.
The new method takes the 8 as an input and tells if the range contains more than that many elements without requiring any wider math.
llvm-svn: 302385
-rw-r--r-- | llvm/include/llvm/IR/ConstantRange.h | 3 | ||||
-rw-r--r-- | llvm/lib/IR/ConstantRange.cpp | 11 | ||||
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 2 |
3 files changed, 15 insertions, 1 deletions
diff --git a/llvm/include/llvm/IR/ConstantRange.h b/llvm/include/llvm/IR/ConstantRange.h index c6d76827f4f..6a50a8801f8 100644 --- a/llvm/include/llvm/IR/ConstantRange.h +++ b/llvm/include/llvm/IR/ConstantRange.h @@ -169,6 +169,9 @@ public: /// Compare set size of this range with the range CR. bool isSizeStrictlySmallerThan(const ConstantRange &CR) const; + // Compare set size of this range with Value. + bool isSizeLargerThan(uint64_t MaxSize) const; + /// Return the largest unsigned value contained in the ConstantRange. APInt getUnsignedMax() const; diff --git a/llvm/lib/IR/ConstantRange.cpp b/llvm/lib/IR/ConstantRange.cpp index cb703f6efc6..aeb1257754f 100644 --- a/llvm/lib/IR/ConstantRange.cpp +++ b/llvm/lib/IR/ConstantRange.cpp @@ -260,6 +260,17 @@ ConstantRange::isSizeStrictlySmallerThan(const ConstantRange &Other) const { return (Upper - Lower).ult(Other.Upper - Other.Lower); } +bool +ConstantRange::isSizeLargerThan(uint64_t MaxSize) const { + assert(MaxSize && "MaxSize can't be 0."); + // If this a full set, we need special handling to avoid needing an extra bit + // to represent the size. + if (isFullSet()) + return APInt::getMaxValue(getBitWidth()).ugt(MaxSize - 1); + + return (Upper - Lower).ugt(MaxSize); +} + APInt ConstantRange::getUnsignedMax() const { if (isFullSet() || isWrappedSet()) return APInt::getMaxValue(getBitWidth()); diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 7a3e8b9ae91..b44bc74d655 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -596,7 +596,7 @@ private: Span = Span.inverse(); // If there are a ton of values, we don't want to make a ginormous switch. - if (Span.getSetSize().ugt(8) || Span.isEmptySet()) { + if (Span.isSizeLargerThan(8) || Span.isEmptySet()) { return false; } |