From: Eli Friedman Date: Thu, 10 Aug 2017 19:31:27 +0000 (+0000) Subject: [ARM] Clarify legal addressing modes for ARM and Thumb2. NFC X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c5716175fe5d49ffcf60b1b710791fdb4f5a64c6;p=llvm [ARM] Clarify legal addressing modes for ARM and Thumb2. NFC The existing code is very clever, but not clear, which seems like the wrong tradeoff here. Differential Revision: https://reviews.llvm.org/D36559 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310653 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp index 9746490988e..753008588fc 100644 --- a/lib/Target/ARM/ARMISelLowering.cpp +++ b/lib/Target/ARM/ARMISelLowering.cpp @@ -12357,8 +12357,13 @@ bool ARMTargetLowering::isLegalT2ScaledAddressingMode(const AddrMode &AM, Scale = Scale & ~1; return Scale == 2 || Scale == 4 || Scale == 8; case MVT::i64: + // FIXME: What are we trying to model here? ldrd doesn't have an r + r + // version in Thumb mode. // r + r - if (((unsigned)AM.HasBaseReg + Scale) <= 2) + if (Scale == 1) + return true; + // r * 2 (this can be lowered to r + r). + if (!AM.HasBaseReg && Scale == 2) return true; return false; case MVT::isVoid: @@ -12416,8 +12421,11 @@ bool ARMTargetLowering::isLegalAddressingMode(const DataLayout &DL, return isPowerOf2_32(Scale & ~1); case MVT::i16: case MVT::i64: - // r + r - if (((unsigned)AM.HasBaseReg + Scale) <= 2) + // r +/- r + if (Scale == 1 || (AM.HasBaseReg && Scale == -1)) + return true; + // r * 2 (this can be lowered to r + r). + if (!AM.HasBaseReg && Scale == 2) return true; return false;