Index: lib/Target/ARM/Thumb2ITBlockPass.cpp =================================================================== --- lib/Target/ARM/Thumb2ITBlockPass.cpp +++ lib/Target/ARM/Thumb2ITBlockPass.cpp @@ -158,7 +158,12 @@ return false; } +static bool IsAddress(const MachineOperand &MO) { + return MO.isGlobal() || MO.isSymbol() || MO.isCPI(); +} + bool Thumb2ITBlockPass::InsertITInstructions(MachineBasicBlock &MBB) { + const Triple T(MBB.getParent()->getTarget().getTargetTriple()); bool Modified = false; SmallSet Defs; @@ -207,6 +212,16 @@ MachineInstr *NMI = &*MBBI; MI = NMI; + if (T.isOSWindows()) { + if (MI->getOpcode() == ARM::t2MOVi16 && IsAddress(MI->getOperand(1))) { + assert(MI->getOperand(1).getTargetFlags() == ARMII::MO_LO16 && + "expected low address load"); + assert(MBBI != E && "expected hi address load instruction"); + if (Pos < 2) + break; + } + } + unsigned NPredReg = 0; ARMCC::CondCodes NCC = getITInstrPredicate(NMI, NPredReg); if (NCC == CC || NCC == OCC) {