[llvm-dev] scheduling across calls to avoid spills
Davis, Alan via llvm-dev
llvm-dev at lists.llvm.org
Fri Oct 11 09:09:20 PDT 2019
I have some machine code that looks something like:
flag = true
c = call()
flag = false
if (flag) ...
The 'flag' variable is a Boolean value of type i1. The target has 1-bit condition registers but none are preserved across calls. So flag is spilled to memory, resulting in terrible code.
There is no dependency between the flag=true instruction and the call, so I'd like to move it after the call. I was hoping the front end would do it via TargetTransformInfo::getCostOfKeepingLiveOverCall. But apparently that only applies to vectorization transforms.
The pre-RA MachineScheduler won't do it either, because scheduling regions are delimited by calls. (From MachineScheduler.cpp: "MachineScheduler does not currently support scheduling across calls.")
Is there some standard way in the front end or codegen to make this happen?
More information about the llvm-dev