<div dir="ltr"><div class="gmail_extra">This seems a very natural approach but I probably am having a trouble with the iterator invalidation. However, looking at other peephole optimizers passes, I couldn't see how to do this:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">#define BUILD_INS(opcode, new_reg, i)                               \</div><div class="gmail_extra">  BuildMI(*MBB, MBBI, MBBI->getDebugLoc(), TII->get(X86::opcode))   \</div><div class="gmail_extra">    .addReg(X86::new_reg, kill).addImm(i)</div><div class="gmail_extra"><br></div><div class="gmail_extra">  for (MachineFunction::iterator MFI = MF.begin(), MFE = MF.end();</div><div class="gmail_extra">       MFI != MFE; ++MFI) {</div><div class="gmail_extra">    MachineBasicBlock* MBB = MFI;</div><div class="gmail_extra"><br></div><div class="gmail_extra">    for (MachineBasicBlock::iterator MBBI = MBB->begin();</div><div class="gmail_extra">        MBBI != MBB->end(); ++MBBI) {</div><div class="gmail_extra">      MachineInstr *NewMI = NULL;</div><div class="gmail_extra">      OldMI = MBBI;</div><div class="gmail_extra"><br></div><div class="gmail_extra">      // %EFLAGS<imp-def>   is getting copied</div><div class="gmail_extra">      // %RDX<imp-use,kill> is not getting copied (when it appears)</div><div class="gmail_extra"><div class="gmail_extra">      switch (OldMI->getOpcode()) {</div><div class="gmail_extra">      default:                continue;</div><div>      // ....</div><div><br></div></div><div class="gmail_extra">      case X86::BT64ri8:</div><div class="gmail_extra">      case X86::BT32ri8:</div><div class="gmail_extra">      case X86::BT16ri8: {</div><div class="gmail_extra">          assert(OldMI->getNumOperands() >= 2);</div><div class="gmail_extra">          MachineOperand &Reg = OldMI->getOperand(0);</div><div class="gmail_extra">          MachineOperand &Imm = OldMI->getOperand(1);</div><div class="gmail_extra">          assert(Reg.isReg());</div><div class="gmail_extra">          assert(Imm.isImm());</div><div class="gmail_extra">          imm = Imm.getImm();</div><div class="gmail_extra"><br></div><div class="gmail_extra">          if (imm >= 32)</div><div class="gmail_extra">            continue;</div><div class="gmail_extra"><br></div><div class="gmail_extra">          kill = getKillRegState(Reg.isKill());</div><div class="gmail_extra"><br></div><div class="gmail_extra">          switch (Reg.getReg()) {</div><div class="gmail_extra">          default:              assert(false);</div><div class="gmail_extra">          case X86::RAX:</div><div class="gmail_extra">          case X86::EAX:</div><div class="gmail_extra">          case X86::AX:</div><div class="gmail_extra">            if (imm < 8)        NewMI = BUILD_INS(TEST8i8, AL, 1 << imm);</div><div class="gmail_extra">            else if (imm < 16)  NewMI = BUILD_INS(TEST8ri, AH, 1 << (imm - 8));</div><div class="gmail_extra">            else                NewMI = BUILD_INS(BT32ri8, EAX, imm);</div><div class="gmail_extra">            break;</div><div class="gmail_extra"><br></div><div class="gmail_extra">          // ...</div><div class="gmail_extra">          }</div><div class="gmail_extra">        }</div><div class="gmail_extra">        break;</div><div class="gmail_extra">      }</div><div class="gmail_extra"><br></div><div class="gmail_extra">      // NewMI has been inserted before OldMI</div><div class="gmail_extra">      if (NewMI != NULL) {</div><div class="gmail_extra">//        MBB->remove_instr(OldMI);      // I've tried these (and others)</div><div class="gmail_extra">//        OldMI->removeFromParent();</div><div class="gmail_extra">//        MBB.erase(OldMI);</div><div class="gmail_extra">        NumX86Peepholes++;</div><div class="gmail_extra">      }</div><div class="gmail_extra">    }</div><div><br></div></div></div>