#
47fd2de3 |
| 31-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Fix bugs in isShiftedMask to match behavior of the similar function in MathExtras.h
This removes a parameter from the routine that was responsible for a lot of the issue. It was a bit count
[APInt] Fix bugs in isShiftedMask to match behavior of the similar function in MathExtras.h
This removes a parameter from the routine that was responsible for a lot of the issue. It was a bit count that had to be set to the BitWidth of the APInt and would get passed to getLowBitsSet. This guaranteed the call to getLowBitsSet would create an all ones value. This was then compared to (V | (V-1)). So the only shifted masks we detected had to have the MSB set.
The one in tree user is a transform in InstCombine that never fires due to earlier transforms covering the case better. I've submitted a patch to remove it completely, but for now I've just adapted it to the new interface for isShiftedMask.
llvm-svn: 299273
show more ...
|
#
e7e35602 |
| 31-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Rewrite getLoBits in a way that will do one less memory allocation in the multiword case. Rewrite getHiBits to use the class method version of lshr instead of the one in APIntOps. NFCI
llvm-
[APInt] Rewrite getLoBits in a way that will do one less memory allocation in the multiword case. Rewrite getHiBits to use the class method version of lshr instead of the one in APIntOps. NFCI
llvm-svn: 299243
show more ...
|
#
a4f660b6 |
| 31-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Add unittests that demonstrate how very broken APIntOps::isShiftedMask is.
Did you know that 0 is a shifted mask? But 0x0000ff00 and 0x000000ff aren't? At least we get 0xff000000 right.
I o
[APInt] Add unittests that demonstrate how very broken APIntOps::isShiftedMask is.
Did you know that 0 is a shifted mask? But 0x0000ff00 and 0x000000ff aren't? At least we get 0xff000000 right.
I only see one usage of this function in the code base today and its in InstCombine. I think its protected against 0 being misreported as a mask. I guess we just don't have tests for the missed cases.
llvm-svn: 299187
show more ...
|
#
e4c4668d |
| 27-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Use memset in setAllBits.
llvm-svn: 298867
|
#
e9313ba2 |
| 10-Mar-2017 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
Fix signed/unsigned comparison warnings
llvm-svn: 297460
|
#
b02667c4 |
| 10-Mar-2017 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
[APInt] Add APInt::insertBits() method to insert an APInt into a larger APInt
We currently have to insert bits via a temporary variable of the same size as the target with various shift/mask stages,
[APInt] Add APInt::insertBits() method to insert an APInt into a larger APInt
We currently have to insert bits via a temporary variable of the same size as the target with various shift/mask stages, resulting in further temporary variables, all of which require the allocation of memory for large APInts (MaskSizeInBits > 64).
This is another of the compile time issues identified in PR32037 (see also D30265).
This patch adds the APInt::insertBits() helper method which avoids the temporary memory allocation and masks/inserts the raw bits directly into the target.
Differential Revision: https://reviews.llvm.org/D30780
llvm-svn: 297458
show more ...
|
#
7f81c3d4 |
| 07-Mar-2017 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
Strip trailing whitespace.
llvm-svn: 297225
|
Revision tags: llvmorg-4.0.0, llvmorg-4.0.0-rc4 |
|
#
b60a46fe |
| 07-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Add rvalue reference support to and, or, xor operations to allow their memory allocation to be reused when possible
This extends an earlier change that did similar for add and sub operations
[APInt] Add rvalue reference support to and, or, xor operations to allow their memory allocation to be reused when possible
This extends an earlier change that did similar for add and sub operations.
With this first patch we lose the fastpath for the single word case as operator&= and friends don't support it. This can be added there if we think that's important.
I had to change some functions in the APInt class since the operator overloads were moved out of the class and can't be used inside the class now. The getBitsSet change collides with another outstanding patch to implement it with setBits. But I didn't want to make this patch dependent on that series.
I've also removed the Or, And, Xor functions which were rarely or never used. I already commited two changes to remove the only uses of Or that existed.
Differential Revision: https://reviews.llvm.org/D30612
llvm-svn: 297121
show more ...
|
#
06ec03c2 |
| 07-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Fix test names in unittest to match functions being tested. NFC
llvm-svn: 297115
|
#
bf1c9abd |
| 07-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Add getBitsSetFrom and setBitsFrom to set upper bits starting at a bit
We currently have methods to set a specified number of low bits, a specified number of high bits, or a range of bits. B
[APInt] Add getBitsSetFrom and setBitsFrom to set upper bits starting at a bit
We currently have methods to set a specified number of low bits, a specified number of high bits, or a range of bits. But looking at some existing code it seems sometimes we want to set the high bits starting from a certain bit. Currently we do this with something like getHighBits(BitWidth, BitWidth - StartBit). Or once we start switching to setHighBits, setHighBits(BitWidth - StartBit) or setHighBits(getBitWidth() - StartBit).
Particularly for the latter case it would be better to have a convenience method like setBitsFrom(StartBit) so we don't need to mention the bit width that's already known to the APInt object.
I considered just making setBits have a default value of UINT_MAX for the hiBit argument and we would internally MIN it with the bit width. So if it wasn't specified it would be treated as bit width. This would require removing the assertion we currently have on the value of hiBit and may not be as readable.
Differential Revision: https://reviews.llvm.org/D30602
llvm-svn: 297114
show more ...
|
#
dfd9131d |
| 07-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Implement getLowBitsSet/getHighBitsSet/getBitsSet using setLowBits/setHighBits/setBits
This patch implements getLowBitsSet/getHighBitsSet/getBitsSet in terms of the new setLowBits/setHighBit
[APInt] Implement getLowBitsSet/getHighBitsSet/getBitsSet using setLowBits/setHighBits/setBits
This patch implements getLowBitsSet/getHighBitsSet/getBitsSet in terms of the new setLowBits/setHighBits/setBits methods by making an all 0s APInt and then calling the appropriate set method.
This also adds support to setBits to allow loBits/hiBits to be in the other order to match with getBitsSet behavior.
Differential Revision: https://reviews.llvm.org/D30563
llvm-svn: 297112
show more ...
|
#
bafdd03b |
| 07-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Add setLowBits/setHighBits methods to APInt.
Summary: There are quite a few places in the code base that do something like the following to set the high or low bits in an APInt.
KnownZero |
[APInt] Add setLowBits/setHighBits methods to APInt.
Summary: There are quite a few places in the code base that do something like the following to set the high or low bits in an APInt.
KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - 1);
For BitWidths larger than 64 this creates a short lived APInt with malloced storage. I think it might even call malloc twice. Its better to just provide methods that can set the necessary bits without the temporary APInt.
I'll update usages that benefit in a separate patch.
Reviewers: majnemer, MatzeB, davide, RKSimon, hans
Reviewed By: hans
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D30525
llvm-svn: 297111
show more ...
|
#
a97f927f |
| 06-Mar-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Move operator~ out of line to make it better able to reused memory allocation from temporary objects
Summary: This makes operator~ take the APInt by value so if it came from a temporary APIn
[APInt] Move operator~ out of line to make it better able to reused memory allocation from temporary objects
Summary: This makes operator~ take the APInt by value so if it came from a temporary APInt the move constructor will get invoked and it will be able to reuse the memory allocation from the temporary.
This is similar to what was already done for 2s complement negation.
Reviewers: hans, davide, RKSimon
Reviewed By: davide
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D30614
llvm-svn: 296997
show more ...
|
Revision tags: llvmorg-4.0.0-rc3 |
|
#
7d7b6d76 |
| 26-Feb-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Use UINT64_MAX instead of ~0ULL. NFC
llvm-svn: 296300
|
#
a8b26b87 |
| 26-Feb-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Remove unnecessary early out from getLowBitsSet. The same case is handled equally well by the next check.
llvm-svn: 296299
|
#
0f5fb5f5 |
| 25-Feb-2017 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
[APInt] Add APInt::extractBits() method to extract APInt subrange (reapplied)
The current pattern for extract bits in range is typically:
Mask.lshr(BitOffset).trunc(SubSizeInBits);
Which can be pa
[APInt] Add APInt::extractBits() method to extract APInt subrange (reapplied)
The current pattern for extract bits in range is typically:
Mask.lshr(BitOffset).trunc(SubSizeInBits);
Which can be particularly slow for large APInts (MaskSizeInBits > 64) as they require the allocation of memory for the temporary variable.
This is another of the compile time issues identified in PR32037 (see also D30265).
This patch adds the APInt::extractBits() helper method which avoids the temporary memory allocation.
Differential Revision: https://reviews.llvm.org/D30336
llvm-svn: 296272
show more ...
|
#
cdf2bd65 |
| 24-Feb-2017 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
Revert: r296141 [APInt] Add APInt::extractBits() method to extract APInt subrange
The current pattern for extract bits in range is typically:
Mask.lshr(BitOffset).trunc(SubSizeInBits);
Which can b
Revert: r296141 [APInt] Add APInt::extractBits() method to extract APInt subrange
The current pattern for extract bits in range is typically:
Mask.lshr(BitOffset).trunc(SubSizeInBits);
Which can be particularly slow for large APInts (MaskSizeInBits > 64) as they require the allocation of memory for the temporary variable.
This is another of the compile time issues identified in PR32037 (see also D30265).
This patch adds the APInt::extractBits() helper method which avoids the temporary memory allocation.
Differential Revision: https://reviews.llvm.org/D30336
llvm-svn: 296147
show more ...
|
#
bd9fb2ae |
| 24-Feb-2017 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
[APInt] Add APInt::extractBits() method to extract APInt subrange
The current pattern for extract bits in range is typically:
Mask.lshr(BitOffset).trunc(SubSizeInBits);
Which can be particularly s
[APInt] Add APInt::extractBits() method to extract APInt subrange
The current pattern for extract bits in range is typically:
Mask.lshr(BitOffset).trunc(SubSizeInBits);
Which can be particularly slow for large APInts (MaskSizeInBits > 64) as they require the allocation of memory for the temporary variable.
This is another of the compile time issues identified in PR32037 (see also D30265).
This patch adds the APInt::extractBits() helper method which avoids the temporary memory allocation.
Differential Revision: https://reviews.llvm.org/D30336
llvm-svn: 296141
show more ...
|
#
4f8a4437 |
| 24-Feb-2017 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
Fix signed/unsigned comparison warnings
llvm-svn: 296109
|
#
aed35227 |
| 24-Feb-2017 |
Simon Pilgrim <llvm-dev@redking.me.uk> |
[APInt] Add APInt::setBits() method to set all bits in range
The current pattern for setting bits in range is typically:
Mask |= APInt::getBitsSet(MaskSizeInBits, LoPos, HiPos);
Which can be parti
[APInt] Add APInt::setBits() method to set all bits in range
The current pattern for setting bits in range is typically:
Mask |= APInt::getBitsSet(MaskSizeInBits, LoPos, HiPos);
Which can be particularly slow for large APInts (MaskSizeInBits > 64) as they require the allocation memory for the temporary variable.
This is one of the key compile time issues identified in PR32037.
This patch adds the APInt::setBits() helper method which avoids the temporary memory allocation completely, this first implementation uses setBit() internally instead but already significantly reduces the regression in PR32037 (~10% drop). Additional optimization may be possible.
I investigated whether there is need for APInt::clearBits() and APInt::flipBits() equivalents but haven't seen these patterns to be particularly common, but reusing the code would be trivial.
Differential Revision: https://reviews.llvm.org/D30265
llvm-svn: 296102
show more ...
|
Revision tags: llvmorg-4.0.0-rc2 |
|
#
51c0ae5e |
| 07-Feb-2017 |
Joey Gouly <joey.gouly@gmail.com> |
[APInt] Fix rotl/rotr when the shift amount is greater than the total bit width.
Review: https://reviews.llvm.org/D27749 llvm-svn: 294295
|
#
fb1756b3 |
| 03-Feb-2017 |
Amaury Sechet <deadalnix@gmail.com> |
[APInt] Add integer API bor bitwise operations.
Summary: As per title. I ran into that limitation of the API doing some other work, so I though that'd be a nice addition.
Reviewers: jroelofs, compn
[APInt] Add integer API bor bitwise operations.
Summary: As per title. I ran into that limitation of the API doing some other work, so I though that'd be a nice addition.
Reviewers: jroelofs, compnerd, majnemer
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D29503
llvm-svn: 294063
show more ...
|
#
9028f055 |
| 24-Jan-2017 |
Craig Topper <craig.topper@gmail.com> |
[APInt] Remove calls to clearUnusedBits from XorSlowCase and operator^=
Summary: There's a comment in XorSlowCase that says "0^0==1" which isn't true. 0 xored with 0 is still 0. So I don't think we
[APInt] Remove calls to clearUnusedBits from XorSlowCase and operator^=
Summary: There's a comment in XorSlowCase that says "0^0==1" which isn't true. 0 xored with 0 is still 0. So I don't think we need to clear any unused bits here.
Now there is no difference between XorSlowCase and AndSlowCase/OrSlowCase other than the operation being performed
Reviewers: majnemer, MatzeB, chandlerc, bkramer
Reviewed By: MatzeB
Subscribers: chfast, llvm-commits
Differential Revision: https://reviews.llvm.org/D28986
llvm-svn: 292873
show more ...
|
Revision tags: llvmorg-4.0.0-rc1, llvmorg-3.9.1, llvmorg-3.9.1-rc3, llvmorg-3.9.1-rc2, llvmorg-3.9.1-rc1, llvmorg-3.9.0, llvmorg-3.9.0-rc3, llvmorg-3.9.0-rc2 |
|
#
851b79dc |
| 10-Aug-2016 |
Jonathan Roelofs <jonathan@codesourcery.com> |
Fix UB in APInt::ashr
i64 -1, whose sign bit is the 0th one, can't be left shifted without invoking UB.
https://reviews.llvm.org/D23362
llvm-svn: 278280
|
Revision tags: llvmorg-3.9.0-rc1 |
|
#
fae1cf40 |
| 26-Jul-2016 |
Dimitry Andric <dimitry@andric.com> |
Remove obsolete XFAIL for a test that used to sometimes miscompile under FreeBSD with gcc 4.2.1, a long time ago (see r113824). Noticed by Pete Cooper.
llvm-svn: 276730
|