void HexagonEarlyIfConversion::predicateInstr(MachineBasicBlock *ToB, MachineBasicBlock::iterator At, MachineInstr *MI, unsigned PredR, bool IfTrue) { DebugLoc DL; if (At != ToB->end()) DL = At->getDebugLoc(); else if (!ToB->empty()) DL = ToB->back().getDebugLoc(); unsigned Opc = MI->getOpcode(); if (isPredicableStore(MI)) { unsigned COpc = getCondStoreOpcode(Opc, IfTrue); assert(COpc); MachineInstrBuilder MIB = BuildMI(*ToB, At, DL, HII->get(COpc)); MachineInstr::mop_iterator MOI = MI->operands_begin(); if (HII->isPostIncrement(*MI)) { MIB.add(*MOI); ++MOI; } MIB.addReg(PredR); for (const MachineOperand &MO : make_range(MOI, MI->operands_end())) MIB.add(MO); // Set memory references. MIB.cloneMemRefs(*MI); MI->eraseFromParent(); return; } if (Opc == Hexagon::J2_jump) { MachineBasicBlock *TB = MI->getOperand(0).getMBB(); const MCInstrDesc &D = HII->get(IfTrue ? Hexagon::J2_jumpt : Hexagon::J2_jumpf); BuildMI(*ToB, At, DL, D) .addReg(PredR) .addMBB(TB); MI->eraseFromParent(); return; } // Print the offending instruction unconditionally as we are about to // abort. dbgs() << *MI; llvm_unreachable("Unexpected instruction"); }