Thumb1FrameLowering.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. //===-- Thumb1FrameLowering.cpp - Thumb1 Frame Information ----------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file contains the Thumb1 implementation of TargetFrameLowering class.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "Thumb1FrameLowering.h"
  14. #include "ARMMachineFunctionInfo.h"
  15. #include "llvm/CodeGen/MachineFrameInfo.h"
  16. #include "llvm/CodeGen/MachineFunction.h"
  17. #include "llvm/CodeGen/MachineInstrBuilder.h"
  18. #include "llvm/CodeGen/MachineModuleInfo.h"
  19. #include "llvm/CodeGen/MachineRegisterInfo.h"
  20. using namespace llvm;
  21. bool Thumb1FrameLowering::hasReservedCallFrame(const MachineFunction &MF) const{
  22. const MachineFrameInfo *FFI = MF.getFrameInfo();
  23. unsigned CFSize = FFI->getMaxCallFrameSize();
  24. // It's not always a good idea to include the call frame as part of the
  25. // stack frame. ARM (especially Thumb) has small immediate offset to
  26. // address the stack frame. So a large call frame can cause poor codegen
  27. // and may even makes it impossible to scavenge a register.
  28. if (CFSize >= ((1 << 8) - 1) * 4 / 2) // Half of imm8 * 4
  29. return false;
  30. return !MF.getFrameInfo()->hasVarSizedObjects();
  31. }
  32. static void
  33. emitSPUpdate(MachineBasicBlock &MBB,
  34. MachineBasicBlock::iterator &MBBI,
  35. const TargetInstrInfo &TII, DebugLoc dl,
  36. const Thumb1RegisterInfo &MRI,
  37. int NumBytes, unsigned MIFlags = MachineInstr::NoFlags) {
  38. emitThumbRegPlusImmediate(MBB, MBBI, dl, ARM::SP, ARM::SP, NumBytes, TII,
  39. MRI, MIFlags);
  40. }
  41. void Thumb1FrameLowering::
  42. eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
  43. MachineBasicBlock::iterator I) const {
  44. const Thumb1InstrInfo &TII =
  45. *static_cast<const Thumb1InstrInfo*>(MF.getTarget().getInstrInfo());
  46. const Thumb1RegisterInfo *RegInfo =
  47. static_cast<const Thumb1RegisterInfo*>(MF.getTarget().getRegisterInfo());
  48. if (!hasReservedCallFrame(MF)) {
  49. // If we have alloca, convert as follows:
  50. // ADJCALLSTACKDOWN -> sub, sp, sp, amount
  51. // ADJCALLSTACKUP -> add, sp, sp, amount
  52. MachineInstr *Old = I;
  53. DebugLoc dl = Old->getDebugLoc();
  54. unsigned Amount = Old->getOperand(0).getImm();
  55. if (Amount != 0) {
  56. // We need to keep the stack aligned properly. To do this, we round the
  57. // amount of space needed for the outgoing arguments up to the next
  58. // alignment boundary.
  59. unsigned Align = getStackAlignment();
  60. Amount = (Amount+Align-1)/Align*Align;
  61. // Replace the pseudo instruction with a new instruction...
  62. unsigned Opc = Old->getOpcode();
  63. if (Opc == ARM::ADJCALLSTACKDOWN || Opc == ARM::tADJCALLSTACKDOWN) {
  64. emitSPUpdate(MBB, I, TII, dl, *RegInfo, -Amount);
  65. } else {
  66. assert(Opc == ARM::ADJCALLSTACKUP || Opc == ARM::tADJCALLSTACKUP);
  67. emitSPUpdate(MBB, I, TII, dl, *RegInfo, Amount);
  68. }
  69. }
  70. }
  71. MBB.erase(I);
  72. }
  73. void Thumb1FrameLowering::emitPrologue(MachineFunction &MF) const {
  74. MachineBasicBlock &MBB = MF.front();
  75. MachineBasicBlock::iterator MBBI = MBB.begin();
  76. MachineFrameInfo *MFI = MF.getFrameInfo();
  77. ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
  78. MachineModuleInfo &MMI = MF.getMMI();
  79. const MCRegisterInfo *MRI = MMI.getContext().getRegisterInfo();
  80. const Thumb1RegisterInfo *RegInfo =
  81. static_cast<const Thumb1RegisterInfo*>(MF.getTarget().getRegisterInfo());
  82. const Thumb1InstrInfo &TII =
  83. *static_cast<const Thumb1InstrInfo*>(MF.getTarget().getInstrInfo());
  84. unsigned Align = MF.getTarget().getFrameLowering()->getStackAlignment();
  85. unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize(Align);
  86. unsigned NumBytes = MFI->getStackSize();
  87. const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
  88. DebugLoc dl = MBBI != MBB.end() ? MBBI->getDebugLoc() : DebugLoc();
  89. unsigned FramePtr = RegInfo->getFrameRegister(MF);
  90. unsigned BasePtr = RegInfo->getBaseRegister();
  91. int CFAOffset = 0;
  92. // Thumb add/sub sp, imm8 instructions implicitly multiply the offset by 4.
  93. NumBytes = (NumBytes + 3) & ~3;
  94. MFI->setStackSize(NumBytes);
  95. // Determine the sizes of each callee-save spill areas and record which frame
  96. // belongs to which callee-save spill areas.
  97. unsigned GPRCS1Size = 0, GPRCS2Size = 0, DPRCSSize = 0;
  98. int FramePtrSpillFI = 0;
  99. if (ArgRegsSaveSize) {
  100. emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -ArgRegsSaveSize,
  101. MachineInstr::FrameSetup);
  102. MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
  103. BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
  104. .addSym(SPLabel);
  105. CFAOffset -= ArgRegsSaveSize;
  106. MMI.addFrameInst(
  107. MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset));
  108. }
  109. if (!AFI->hasStackFrame()) {
  110. if (NumBytes != 0) {
  111. emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -NumBytes,
  112. MachineInstr::FrameSetup);
  113. MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
  114. BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
  115. .addSym(SPLabel);
  116. CFAOffset -= NumBytes;
  117. MMI.addFrameInst(
  118. MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset));
  119. }
  120. return;
  121. }
  122. for (unsigned i = 0, e = CSI.size(); i != e; ++i) {
  123. unsigned Reg = CSI[i].getReg();
  124. int FI = CSI[i].getFrameIdx();
  125. switch (Reg) {
  126. case ARM::R8:
  127. case ARM::R9:
  128. case ARM::R10:
  129. case ARM::R11:
  130. if (STI.isTargetMachO()) {
  131. GPRCS2Size += 4;
  132. break;
  133. }
  134. // fallthrough
  135. case ARM::R4:
  136. case ARM::R5:
  137. case ARM::R6:
  138. case ARM::R7:
  139. case ARM::LR:
  140. if (Reg == FramePtr)
  141. FramePtrSpillFI = FI;
  142. GPRCS1Size += 4;
  143. break;
  144. default:
  145. DPRCSSize += 8;
  146. }
  147. }
  148. if (MBBI != MBB.end() && MBBI->getOpcode() == ARM::tPUSH) {
  149. ++MBBI;
  150. if (MBBI != MBB.end())
  151. dl = MBBI->getDebugLoc();
  152. }
  153. // Determine starting offsets of spill areas.
  154. unsigned DPRCSOffset = NumBytes - (GPRCS1Size + GPRCS2Size + DPRCSSize);
  155. unsigned GPRCS2Offset = DPRCSOffset + DPRCSSize;
  156. unsigned GPRCS1Offset = GPRCS2Offset + GPRCS2Size;
  157. bool HasFP = hasFP(MF);
  158. if (HasFP)
  159. AFI->setFramePtrSpillOffset(MFI->getObjectOffset(FramePtrSpillFI) +
  160. NumBytes);
  161. AFI->setGPRCalleeSavedArea1Offset(GPRCS1Offset);
  162. AFI->setGPRCalleeSavedArea2Offset(GPRCS2Offset);
  163. AFI->setDPRCalleeSavedAreaOffset(DPRCSOffset);
  164. NumBytes = DPRCSOffset;
  165. int FramePtrOffsetInBlock = 0;
  166. unsigned adjustedGPRCS1Size = GPRCS1Size;
  167. if (tryFoldSPUpdateIntoPushPop(STI, MF, std::prev(MBBI), NumBytes)) {
  168. FramePtrOffsetInBlock = NumBytes;
  169. adjustedGPRCS1Size += NumBytes;
  170. NumBytes = 0;
  171. }
  172. MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
  173. BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL)).addSym(SPLabel);
  174. if (adjustedGPRCS1Size) {
  175. CFAOffset -= adjustedGPRCS1Size;
  176. MMI.addFrameInst(
  177. MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset));
  178. }
  179. for (std::vector<CalleeSavedInfo>::const_iterator I = CSI.begin(),
  180. E = CSI.end(); I != E; ++I) {
  181. unsigned Reg = I->getReg();
  182. int FI = I->getFrameIdx();
  183. switch (Reg) {
  184. case ARM::R8:
  185. case ARM::R9:
  186. case ARM::R10:
  187. case ARM::R11:
  188. case ARM::R12:
  189. if (STI.isTargetMachO())
  190. break;
  191. // fallthough
  192. case ARM::R0:
  193. case ARM::R1:
  194. case ARM::R2:
  195. case ARM::R3:
  196. case ARM::R4:
  197. case ARM::R5:
  198. case ARM::R6:
  199. case ARM::R7:
  200. case ARM::LR:
  201. MMI.addFrameInst(MCCFIInstruction::createOffset(SPLabel,
  202. MRI->getDwarfRegNum(Reg, true),
  203. MFI->getObjectOffset(FI) - ArgRegsSaveSize));
  204. break;
  205. }
  206. }
  207. // Adjust FP so it point to the stack slot that contains the previous FP.
  208. if (HasFP) {
  209. FramePtrOffsetInBlock += MFI->getObjectOffset(FramePtrSpillFI) + GPRCS1Size;
  210. AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tADDrSPi), FramePtr)
  211. .addReg(ARM::SP).addImm(FramePtrOffsetInBlock / 4)
  212. .setMIFlags(MachineInstr::FrameSetup));
  213. MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
  214. BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
  215. .addSym(SPLabel);
  216. if(FramePtrOffsetInBlock) {
  217. CFAOffset += FramePtrOffsetInBlock;
  218. MMI.addFrameInst(
  219. MCCFIInstruction::createDefCfa(SPLabel,
  220. MRI->getDwarfRegNum(FramePtr, true), CFAOffset));
  221. } else
  222. MMI.addFrameInst(
  223. MCCFIInstruction::createDefCfaRegister(SPLabel,
  224. MRI->getDwarfRegNum(FramePtr, true)));
  225. if (NumBytes > 508)
  226. // If offset is > 508 then sp cannot be adjusted in a single instruction,
  227. // try restoring from fp instead.
  228. AFI->setShouldRestoreSPFromFP(true);
  229. }
  230. if (NumBytes) {
  231. // Insert it after all the callee-save spills.
  232. emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, -NumBytes,
  233. MachineInstr::FrameSetup);
  234. if (!HasFP) {
  235. MCSymbol *SPLabel = MMI.getContext().CreateTempSymbol();
  236. BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::PROLOG_LABEL))
  237. .addSym(SPLabel);
  238. CFAOffset -= NumBytes;
  239. MMI.addFrameInst(
  240. MCCFIInstruction::createDefCfaOffset(SPLabel, CFAOffset));
  241. }
  242. }
  243. if (STI.isTargetELF() && HasFP)
  244. MFI->setOffsetAdjustment(MFI->getOffsetAdjustment() -
  245. AFI->getFramePtrSpillOffset());
  246. AFI->setGPRCalleeSavedArea1Size(GPRCS1Size);
  247. AFI->setGPRCalleeSavedArea2Size(GPRCS2Size);
  248. AFI->setDPRCalleeSavedAreaSize(DPRCSSize);
  249. // Thumb1 does not currently support dynamic stack realignment. Report a
  250. // fatal error rather then silently generate bad code.
  251. if (RegInfo->needsStackRealignment(MF))
  252. report_fatal_error("Dynamic stack realignment not supported for thumb1.");
  253. // If we need a base pointer, set it up here. It's whatever the value
  254. // of the stack pointer is at this point. Any variable size objects
  255. // will be allocated after this, so we can still use the base pointer
  256. // to reference locals.
  257. if (RegInfo->hasBasePointer(MF))
  258. AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr), BasePtr)
  259. .addReg(ARM::SP));
  260. // If the frame has variable sized objects then the epilogue must restore
  261. // the sp from fp. We can assume there's an FP here since hasFP already
  262. // checks for hasVarSizedObjects.
  263. if (MFI->hasVarSizedObjects())
  264. AFI->setShouldRestoreSPFromFP(true);
  265. }
  266. static bool isCSRestore(MachineInstr *MI, const uint16_t *CSRegs) {
  267. if (MI->getOpcode() == ARM::tLDRspi &&
  268. MI->getOperand(1).isFI() &&
  269. isCalleeSavedRegister(MI->getOperand(0).getReg(), CSRegs))
  270. return true;
  271. else if (MI->getOpcode() == ARM::tPOP) {
  272. // The first two operands are predicates. The last two are
  273. // imp-def and imp-use of SP. Check everything in between.
  274. for (int i = 2, e = MI->getNumOperands() - 2; i != e; ++i)
  275. if (!isCalleeSavedRegister(MI->getOperand(i).getReg(), CSRegs))
  276. return false;
  277. return true;
  278. }
  279. return false;
  280. }
  281. void Thumb1FrameLowering::emitEpilogue(MachineFunction &MF,
  282. MachineBasicBlock &MBB) const {
  283. MachineBasicBlock::iterator MBBI = MBB.getLastNonDebugInstr();
  284. assert((MBBI->getOpcode() == ARM::tBX_RET ||
  285. MBBI->getOpcode() == ARM::tPOP_RET) &&
  286. "Can only insert epilog into returning blocks");
  287. DebugLoc dl = MBBI->getDebugLoc();
  288. MachineFrameInfo *MFI = MF.getFrameInfo();
  289. ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
  290. const Thumb1RegisterInfo *RegInfo =
  291. static_cast<const Thumb1RegisterInfo*>(MF.getTarget().getRegisterInfo());
  292. const Thumb1InstrInfo &TII =
  293. *static_cast<const Thumb1InstrInfo*>(MF.getTarget().getInstrInfo());
  294. unsigned Align = MF.getTarget().getFrameLowering()->getStackAlignment();
  295. unsigned ArgRegsSaveSize = AFI->getArgRegsSaveSize(Align);
  296. int NumBytes = (int)MFI->getStackSize();
  297. const uint16_t *CSRegs = RegInfo->getCalleeSavedRegs();
  298. unsigned FramePtr = RegInfo->getFrameRegister(MF);
  299. if (!AFI->hasStackFrame()) {
  300. if (NumBytes != 0)
  301. emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, NumBytes);
  302. } else {
  303. // Unwind MBBI to point to first LDR / VLDRD.
  304. if (MBBI != MBB.begin()) {
  305. do
  306. --MBBI;
  307. while (MBBI != MBB.begin() && isCSRestore(MBBI, CSRegs));
  308. if (!isCSRestore(MBBI, CSRegs))
  309. ++MBBI;
  310. }
  311. // Move SP to start of FP callee save spill area.
  312. NumBytes -= (AFI->getGPRCalleeSavedArea1Size() +
  313. AFI->getGPRCalleeSavedArea2Size() +
  314. AFI->getDPRCalleeSavedAreaSize());
  315. if (AFI->shouldRestoreSPFromFP()) {
  316. NumBytes = AFI->getFramePtrSpillOffset() - NumBytes;
  317. // Reset SP based on frame pointer only if the stack frame extends beyond
  318. // frame pointer stack slot, the target is ELF and the function has FP, or
  319. // the target uses var sized objects.
  320. if (NumBytes) {
  321. assert(MF.getRegInfo().isPhysRegUsed(ARM::R4) &&
  322. "No scratch register to restore SP from FP!");
  323. emitThumbRegPlusImmediate(MBB, MBBI, dl, ARM::R4, FramePtr, -NumBytes,
  324. TII, *RegInfo);
  325. AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
  326. ARM::SP)
  327. .addReg(ARM::R4));
  328. } else
  329. AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tMOVr),
  330. ARM::SP)
  331. .addReg(FramePtr));
  332. } else {
  333. if (MBBI->getOpcode() == ARM::tBX_RET &&
  334. &MBB.front() != MBBI &&
  335. std::prev(MBBI)->getOpcode() == ARM::tPOP) {
  336. MachineBasicBlock::iterator PMBBI = std::prev(MBBI);
  337. if (!tryFoldSPUpdateIntoPushPop(STI, MF, PMBBI, NumBytes))
  338. emitSPUpdate(MBB, PMBBI, TII, dl, *RegInfo, NumBytes);
  339. } else if (!tryFoldSPUpdateIntoPushPop(STI, MF, MBBI, NumBytes))
  340. emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, NumBytes);
  341. }
  342. }
  343. if (ArgRegsSaveSize) {
  344. // Unlike T2 and ARM mode, the T1 pop instruction cannot restore
  345. // to LR, and we can't pop the value directly to the PC since
  346. // we need to update the SP after popping the value. Therefore, we
  347. // pop the old LR into R3 as a temporary.
  348. // Get the last instruction, tBX_RET
  349. MBBI = MBB.getLastNonDebugInstr();
  350. assert (MBBI->getOpcode() == ARM::tBX_RET);
  351. // Epilogue for vararg functions: pop LR to R3 and branch off it.
  352. AddDefaultPred(BuildMI(MBB, MBBI, dl, TII.get(ARM::tPOP)))
  353. .addReg(ARM::R3, RegState::Define);
  354. emitSPUpdate(MBB, MBBI, TII, dl, *RegInfo, ArgRegsSaveSize);
  355. MachineInstrBuilder MIB =
  356. BuildMI(MBB, MBBI, dl, TII.get(ARM::tBX_RET_vararg))
  357. .addReg(ARM::R3, RegState::Kill);
  358. AddDefaultPred(MIB);
  359. MIB.copyImplicitOps(&*MBBI);
  360. // erase the old tBX_RET instruction
  361. MBB.erase(MBBI);
  362. }
  363. }
  364. bool Thumb1FrameLowering::
  365. spillCalleeSavedRegisters(MachineBasicBlock &MBB,
  366. MachineBasicBlock::iterator MI,
  367. const std::vector<CalleeSavedInfo> &CSI,
  368. const TargetRegisterInfo *TRI) const {
  369. if (CSI.empty())
  370. return false;
  371. DebugLoc DL;
  372. MachineFunction &MF = *MBB.getParent();
  373. const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
  374. if (MI != MBB.end()) DL = MI->getDebugLoc();
  375. MachineInstrBuilder MIB = BuildMI(MBB, MI, DL, TII.get(ARM::tPUSH));
  376. AddDefaultPred(MIB);
  377. for (unsigned i = CSI.size(); i != 0; --i) {
  378. unsigned Reg = CSI[i-1].getReg();
  379. bool isKill = true;
  380. // Add the callee-saved register as live-in unless it's LR and
  381. // @llvm.returnaddress is called. If LR is returned for @llvm.returnaddress
  382. // then it's already added to the function and entry block live-in sets.
  383. if (Reg == ARM::LR) {
  384. MachineFunction &MF = *MBB.getParent();
  385. if (MF.getFrameInfo()->isReturnAddressTaken() &&
  386. MF.getRegInfo().isLiveIn(Reg))
  387. isKill = false;
  388. }
  389. if (isKill)
  390. MBB.addLiveIn(Reg);
  391. MIB.addReg(Reg, getKillRegState(isKill));
  392. }
  393. MIB.setMIFlags(MachineInstr::FrameSetup);
  394. return true;
  395. }
  396. bool Thumb1FrameLowering::
  397. restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
  398. MachineBasicBlock::iterator MI,
  399. const std::vector<CalleeSavedInfo> &CSI,
  400. const TargetRegisterInfo *TRI) const {
  401. if (CSI.empty())
  402. return false;
  403. MachineFunction &MF = *MBB.getParent();
  404. ARMFunctionInfo *AFI = MF.getInfo<ARMFunctionInfo>();
  405. const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
  406. bool isVarArg = AFI->getArgRegsSaveSize() > 0;
  407. DebugLoc DL = MI->getDebugLoc();
  408. MachineInstrBuilder MIB = BuildMI(MF, DL, TII.get(ARM::tPOP));
  409. AddDefaultPred(MIB);
  410. bool NumRegs = false;
  411. for (unsigned i = CSI.size(); i != 0; --i) {
  412. unsigned Reg = CSI[i-1].getReg();
  413. if (Reg == ARM::LR) {
  414. // Special epilogue for vararg functions. See emitEpilogue
  415. if (isVarArg)
  416. continue;
  417. Reg = ARM::PC;
  418. (*MIB).setDesc(TII.get(ARM::tPOP_RET));
  419. MIB.copyImplicitOps(&*MI);
  420. MI = MBB.erase(MI);
  421. }
  422. MIB.addReg(Reg, getDefRegState(true));
  423. NumRegs = true;
  424. }
  425. // It's illegal to emit pop instruction without operands.
  426. if (NumRegs)
  427. MBB.insert(MI, &*MIB);
  428. else
  429. MF.DeleteMachineInstr(MIB);
  430. return true;
  431. }