[llvm-dev] X86 Backend - How to push and pop eflags?

Fabio Pagani via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 29 14:06:35 PST 2016

Hello llvm-dev list,

i am implementing an X86 Machine Pass that at some point needs to push/pop
eflags on the stack. This pass is hooked at preRegAlloc and LLVM is 3.7.0.
I got two big problems:
1) I didn't found a way to emit a pushfq instruction in a clean way, i.e.
with   BuildMI(*MBB, MI, DL, TII.get(X86::PUSHF64)). Even if both EFLAGS
and RSP are added to the MBB liveins, the Machine Verifier complains saying:
*** Bad machine code: Using an undefined physical register ***

- function:    main

- basic block: BB#238 for.inc.121.4 (0x43133b0)
- instruction: PUSHF64- operand 2:   %EFLAGS<imp-use,kill>

Anyway right now i'm able to push it via some "dirty" INLINE_ASM.

2) INLINE_ASM works pretty well, except in one randomly generated test case
where the register allocator spills a register in between the pushfq/popfq,
resulting in a crash of the compiled application.

So the question is: is there a recommended way to save and restore the
value of eflags?

Any help is really appreciated!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160229/48d85701/attachment-0001.html>

More information about the llvm-dev mailing list