summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@gmail.com>2017-03-01 21:06:18 +0000
committerCraig Topper <craig.topper@gmail.com>2017-03-01 21:06:18 +0000
commitf78a6f084cc27b230d93ebeca091b0182e0ebc27 (patch)
tree343d73cd7d91c5b97a1f2a84ee18c6071207e9ff
parentd9e4464ccde03dd6eddf224cba39f85733c358c0 (diff)
downloadbcm5719-llvm-f78a6f084cc27b230d93ebeca091b0182e0ebc27.tar.gz
bcm5719-llvm-f78a6f084cc27b230d93ebeca091b0182e0ebc27.zip
[APInt] Optimize APInt creation from uint64_t
Summary: This patch moves the clearUnusedBits calls into the two different initialization paths for APInt from a uint64_t. This allows the compiler to better optimize the clearing of the unused bits for the single word case. And it puts the clearing for the multi word case into the initSlowCase function to save code. In the common case of initializing with 0 this allows the clearing to be completely optimized out for the single word case. On my local x86 build this is showing a ~45kb reduction in the size of the opt binary. Reviewers: RKSimon, hans, majnemer, davide, MatzeB Reviewed By: hans Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D30486 llvm-svn: 296677
-rw-r--r--llvm/include/llvm/ADT/APInt.h7
-rw-r--r--llvm/lib/Support/APInt.cpp1
2 files changed, 5 insertions, 3 deletions
diff --git a/llvm/include/llvm/ADT/APInt.h b/llvm/include/llvm/ADT/APInt.h
index 2af3aabe188..2acb60f769d 100644
--- a/llvm/include/llvm/ADT/APInt.h
+++ b/llvm/include/llvm/ADT/APInt.h
@@ -240,11 +240,12 @@ public:
APInt(unsigned numBits, uint64_t val, bool isSigned = false)
: BitWidth(numBits), VAL(0) {
assert(BitWidth && "bitwidth too small");
- if (isSingleWord())
+ if (isSingleWord()) {
VAL = val;
- else
+ clearUnusedBits();
+ } else {
initSlowCase(val, isSigned);
- clearUnusedBits();
+ }
}
/// \brief Construct an APInt of numBits width, initialized as bigVal[].
diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp
index 10124fabaec..836498e6c0e 100644
--- a/llvm/lib/Support/APInt.cpp
+++ b/llvm/lib/Support/APInt.cpp
@@ -81,6 +81,7 @@ void APInt::initSlowCase(uint64_t val, bool isSigned) {
if (isSigned && int64_t(val) < 0)
for (unsigned i = 1; i < getNumWords(); ++i)
pVal[i] = -1ULL;
+ clearUnusedBits();
}
void APInt::initSlowCase(const APInt& that) {
OpenPOWER on IntegriCloud