diff options
| author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-04-05 03:10:56 +0000 | 
|---|---|---|
| committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-04-05 03:10:56 +0000 | 
| commit | 9243c4f7c54b8d0be22a4c9d411b15f462039d06 (patch) | |
| tree | 768ec2f4128b47e5a5f7e1557309c3c1664afc1d /lib | |
| parent | 63246de68653ce330c55453cf9a18a306a4d2319 (diff) | |
| download | external_llvm-9243c4f7c54b8d0be22a4c9d411b15f462039d06.zip external_llvm-9243c4f7c54b8d0be22a4c9d411b15f462039d06.tar.gz external_llvm-9243c4f7c54b8d0be22a4c9d411b15f462039d06.tar.bz2 | |
Pass the right sign to TLI->isLegalICmpImmediate.
LSR can fold three addressing modes into its ICmpZero node:
  ICmpZero BaseReg + Offset      => ICmp BaseReg, -Offset
  ICmpZero -1*ScaleReg + Offset  => ICmp ScaleReg, Offset
  ICmpZero BaseReg + -1*ScaleReg => ICmp BaseReg, ScaleReg
The first two cases are only used if TLI->isLegalICmpImmediate() likes
the offset.
Make sure the right Offset sign is passed to this method in the second
case. The ARM version is not symmetric.
<rdar://problem/11184260>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154079 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Transforms/Scalar/LoopStrengthReduce.cpp | 13 | 
1 files changed, 11 insertions, 2 deletions
| diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 7e71683..d57ec22 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1282,10 +1282,19 @@ static bool isLegalUse(const TargetLowering::AddrMode &AM,      // If we have low-level target information, ask the target if it can fold an      // integer immediate on an icmp.      if (AM.BaseOffs != 0) { -      if (TLI) return TLI->isLegalICmpImmediate(-(uint64_t)AM.BaseOffs); -      return false; +      if (!TLI) +        return false; +      // We have one of: +      // ICmpZero     BaseReg + Offset => ICmp BaseReg, -Offset +      // ICmpZero -1*ScaleReg + Offset => ICmp ScaleReg, Offset +      // Offs is the ICmp immediate. +      int64_t Offs = AM.BaseOffs; +      if (AM.Scale == 0) +        Offs = -(uint64_t)Offs; // The cast does the right thing with INT64_MIN. +      return TLI->isLegalICmpImmediate(Offs);      } +    // ICmpZero BaseReg + -1*ScaleReg => ICmp BaseReg, ScaleReg      return true;    case LSRUse::Basic: | 
