Index: lib/Target/ARM/ARMBaseInstrInfo.cpp =================================================================== --- lib/Target/ARM/ARMBaseInstrInfo.cpp +++ lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -2736,35 +2736,29 @@ } I = CmpInstr; E = MI; - } else if (E != B) { - // Allow the loop below to search E (which was initially MI). Since MI and - // SubAdd have different tests, even if that instruction could not be MI, it - // could still potentially be SubAdd. - --E; } // Check that CPSR isn't set between the comparison instruction and the one we // want to change. At the same time, search for SubAdd. const TargetRegisterInfo *TRI = &getRegisterInfo(); - --I; - for (; I != E; --I) { - const MachineInstr &Instr = *I; + do { + const MachineInstr &Instr = *--I; // Check whether CmpInstr can be made redundant by the current instruction. - if (isRedundantFlagInstr(&CmpInstr, SrcReg, SrcReg2, CmpValue, &*I)) { + if (isRedundantFlagInstr(&CmpInstr, SrcReg, SrcReg2, CmpValue, &Instr)) { SubAdd = &*I; break; } - if (Instr.modifiesRegister(ARM::CPSR, TRI) || - Instr.readsRegister(ARM::CPSR, TRI)) + if ((Instr.modifiesRegister(ARM::CPSR, TRI) || + Instr.readsRegister(ARM::CPSR, TRI)) && I != E) // This instruction modifies or uses CPSR after the one we want to // change. We can't do this transformation. return false; - if (I == B) - break; - } + // Do not search before E (which was initially MI) or the beginning of the + // basic block. We consider E itself because it could still be SubAdd. + } while (I != B && I != E); // Return false if no candidates exist. if (!MI && !SubAdd)