<div dir="ltr"><div><div>Hi All,<br><br></div>For various obscure reasons I'd like to detect the condition when X86 CALL instruction immediately precedes a function epilogue in the final emitted code, and insert a NOP between them if that happens.<br>
<br></div><div>My initial attempt at it looked like this:<br><br>MachineBasicBlock& MBB;<br>MachineBasicBlock::iterator MBBI;  <-- points to where the epilogue would be inserted <br>if (MBBI != MBB.begin() ? MBBI->getPrevNode()->isCall() :<br>
                                          MBB.getPrevNode()->back().isCall()) {<br></div><div>    // insert NOP<br></div><div>}<br><br></div><div>However, this did not work because at the stage where I am trying to do this (in X86FrameLowering::emitEpilogue), the MBBs look like this:<br>
<br></div><div>BB0: <br>    ...<br></div><div>    CALL ...   <-- call I am trying to detect<br></div><div>    EH_LABEL ...   <--| these two get eliminated in the final <br></div><div>    JMP <BB1>      <--| emitted code.<br>
<br></div><div>BB1:  <-- the MBB<br></div><div>    RET  <-- MBBI points here<br><br></div><div>So the business of finding the previous "real" instruction is starting to look very complicated.  I would need to skip over pseudo-instructions and somehow to deal with JMPs that will be eliminated later, and who knows what else...<br>
<br>My question is, am I going about it in the wrong way?    Is there an easier way to achieve what I need? <br></div><div><br></div><div>thanks!<br></div><div>Vadim<br></div></div>