[LLVMdev] Finding previous emitted instruction
Vadim Chugunov
vadimcn at gmail.com
Mon Jul 28 20:02:25 PDT 2014
I am currently trying to figure out where does LLVM eliminate extraneous
JMPs, like the one below. Any hints?
On Sat, Jul 26, 2014 at 12:19 PM, Vadim Chugunov <vadimcn at gmail.com> wrote:
> 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/20140728/21d72e41/attachment.html>
More information about the llvm-dev
mailing list