Index: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp @@ -12357,8 +12357,13 @@ 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 @@ 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;