diff options
Diffstat (limited to 'lib/Target/ARM/ARMLoadStoreOptimizer.cpp')
| -rw-r--r-- | lib/Target/ARM/ARMLoadStoreOptimizer.cpp | 27 | 
1 files changed, 15 insertions, 12 deletions
diff --git a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp index 8fbcf45dfd63..bdbec30d8596 100644 --- a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -253,7 +253,7 @@ ARMLoadStoreOpt::MergeOps(MachineBasicBlock &MBB,          .addImm(ARM_AM::getAM4ModeImm(Mode)).addImm(Pred).addReg(PredReg)      : BuildMI(MBB, MBBI, dl, TII->get(Opcode))          .addReg(Base, getKillRegState(BaseKill)) -        .addImm(ARM_AM::getAM5Opc(Mode, false, isDPR ? NumRegs<<1 : NumRegs)) +        .addImm(ARM_AM::getAM5Opc(Mode, isDPR ? NumRegs<<1 : NumRegs))          .addImm(Pred).addReg(PredReg);    for (unsigned i = 0; i != NumRegs; ++i)      MIB = MIB.addReg(Regs[i].first, getDefRegState(isDef) @@ -505,11 +505,9 @@ bool ARMLoadStoreOpt::MergeBaseUpdateLSMultiple(MachineBasicBlock &MBB,        if (MI->getOperand(i).getReg() == Base)          return false;      } -    assert(!ARM_AM::getAM4WBFlag(MI->getOperand(1).getImm()));      Mode = ARM_AM::getAM4SubMode(MI->getOperand(1).getImm());    } else {      // VLDM{D|S}, VSTM{D|S} addressing mode 5 ops. -    assert(!ARM_AM::getAM5WBFlag(MI->getOperand(1).getImm()));      Mode = ARM_AM::getAM5SubMode(MI->getOperand(1).getImm());      Offset = ARM_AM::getAM5Offset(MI->getOperand(1).getImm());    } @@ -573,11 +571,11 @@ bool ARMLoadStoreOpt::MergeBaseUpdateLSMultiple(MachineBasicBlock &MBB,      .addReg(Base, getKillRegState(BaseKill));    if (isAM4) {      // [t2]LDM_UPD, [t2]STM_UPD -    MIB.addImm(ARM_AM::getAM4ModeImm(Mode, true)) +    MIB.addImm(ARM_AM::getAM4ModeImm(Mode))        .addImm(Pred).addReg(PredReg);    } else {      // VLDM[SD}_UPD, VSTM[SD]_UPD -    MIB.addImm(ARM_AM::getAM5Opc(Mode, true, Offset)) +    MIB.addImm(ARM_AM::getAM5Opc(Mode, Offset))        .addImm(Pred).addReg(PredReg);    }    // Transfer the rest of operands. @@ -709,7 +707,7 @@ bool ARMLoadStoreOpt::MergeBaseUpdateLoadStore(MachineBasicBlock &MBB,    unsigned Offset = 0;    if (isAM5)      Offset = ARM_AM::getAM5Opc(AddSub == ARM_AM::sub ? ARM_AM::db : ARM_AM::ia, -                               true, (isDPR ? 2 : 1)); +                               (isDPR ? 2 : 1));    else if (isAM2)      Offset = ARM_AM::getAM2Opc(AddSub, Bytes, ARM_AM::no_shift);    else @@ -1157,19 +1155,24 @@ namespace {    };  } -/// MergeReturnIntoLDM - If this is a exit BB, try merging the return op -/// (bx lr) into the preceeding stack restore so it directly restore the value -/// of LR into pc. -///   ldmfd sp!, {r7, lr} +/// MergeReturnIntoLDM - If this is a exit BB, try merging the return ops +/// ("bx lr" and "mov pc, lr") into the preceeding stack restore so it +/// directly restore the value of LR into pc. +///   ldmfd sp!, {..., lr}  ///   bx lr +/// or +///   ldmfd sp!, {..., lr} +///   mov pc, lr  /// => -///   ldmfd sp!, {r7, pc} +///   ldmfd sp!, {..., pc}  bool ARMLoadStoreOpt::MergeReturnIntoLDM(MachineBasicBlock &MBB) {    if (MBB.empty()) return false;    MachineBasicBlock::iterator MBBI = prior(MBB.end());    if (MBBI != MBB.begin() && -      (MBBI->getOpcode() == ARM::BX_RET || MBBI->getOpcode() == ARM::tBX_RET)) { +      (MBBI->getOpcode() == ARM::BX_RET || +       MBBI->getOpcode() == ARM::tBX_RET || +       MBBI->getOpcode() == ARM::MOVPCLR)) {      MachineInstr *PrevMI = prior(MBBI);      if (PrevMI->getOpcode() == ARM::LDM_UPD ||          PrevMI->getOpcode() == ARM::t2LDM_UPD) {  | 
