diff options
| author | Geoff Berry <gberry@codeaurora.org> | 2016-06-07 16:48:43 +0000 |
|---|---|---|
| committer | Geoff Berry <gberry@codeaurora.org> | 2016-06-07 16:48:43 +0000 |
| commit | 486f49cc63fa593bbc29817dba9f375b6aeb7e3c (patch) | |
| tree | 998236441d71819d58515a17842ec792be56b860 /llvm/lib | |
| parent | 498abac3e9e73c466b2ab406b15af921238d4213 (diff) | |
| download | bcm5719-llvm-486f49cc63fa593bbc29817dba9f375b6aeb7e3c.tar.gz bcm5719-llvm-486f49cc63fa593bbc29817dba9f375b6aeb7e3c.zip | |
Reapply [AArch64] Fix isLegalAddImmediate() to return true for valid negative values.
Originally reviewed here: http://reviews.llvm.org/D17463
llvm-svn: 272023
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64ISelLowering.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 8d9124670b0..8d103843b5e 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -7313,14 +7313,17 @@ EVT AArch64TargetLowering::getOptimalMemOpType(uint64_t Size, unsigned DstAlign, // 12-bit optionally shifted immediates are legal for adds. bool AArch64TargetLowering::isLegalAddImmediate(int64_t Immed) const { + // Avoid UB for INT64_MIN. + if (Immed == std::numeric_limits<int64_t>::min()) + return false; + // Same encoding for add/sub, just flip the sign. + Immed = std::abs(Immed); return ((Immed >> 12) == 0 || ((Immed & 0xfff) == 0 && Immed >> 24 == 0)); } // Integer comparisons are implemented with ADDS/SUBS, so the range of valid // immediates is the same as for an add or a sub. bool AArch64TargetLowering::isLegalICmpImmediate(int64_t Immed) const { - if (Immed < 0) - Immed *= -1; return isLegalAddImmediate(Immed); } |

