[LLVMdev] Finding previous emitted instruction

Vadim Chugunov vadimcn at gmail.com
Sat Jul 26 12:19:53 PDT 2014


Hi All,

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.

My initial attempt at it looked like this:

MachineBasicBlock& MBB;
MachineBasicBlock::iterator MBBI;  <-- points to where the epilogue would
be inserted
if (MBBI != MBB.begin() ? MBBI->getPrevNode()->isCall() :

MBB.getPrevNode()->back().isCall()) {
    // insert NOP
}

However, this did not work because at the stage where I am trying to do
this (in X86FrameLowering::emitEpilogue), the MBBs look like this:

BB0:
    ...
    CALL ...   <-- call I am trying to detect
    EH_LABEL ...   <--| these two get eliminated in the final
    JMP <BB1>      <--| emitted code.

BB1:  <-- the MBB
    RET  <-- MBBI points here

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...

My question is, am I going about it in the wrong way?    Is there an easier
way to achieve what I need?

thanks!
Vadim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140726/df7b912d/attachment.html>


More information about the llvm-dev mailing list