[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):

bb1:
c = call()
if (c)
  bb2:
  ...
bb3:
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?
>
> -Alan
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191014/b5cb6fa4/attachment.html>


More information about the llvm-dev mailing list