[llvm-dev] scheduling across calls to avoid spills
Hiroshi Yamauchi via llvm-dev
llvm-dev at lists.llvm.org
Mon Oct 14 08:55:23 PDT 2019
On Fri, Oct 11, 2019 at 9:09 AM Davis, Alan via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> I have some machine code that looks something like:
> flag = true
> c = call()
> if (c)
> 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.
If the code looks like this at the IR level (in SSA):
c = call()
flag = phi [ true, bb1 ], [ false, bb2 ]
if (flag) ...
and copy instructions are inserted when going out of SSA, wouldn't "flag =
true" typically be inserted at the end of bb1 (ie. after the call)?
> 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?
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev