[llvm-dev] RFC: Coroutine Optimization Passes
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Mon Jul 18 09:44:36 PDT 2016
I also haven't seen this discussion. Can you provide a pointer to the
thread where this was discussed?
p.s. If this discussion *hasn't* happened, that would definitely be a
blocker for any of the specific work discussed below.
Philip
On 07/14/2016 10:48 PM, Vadim Chugunov via llvm-dev wrote:
> Hi!
> Sorry for jumping in late, but I have a general question (that
> I perhaps should have asked during round 1):
>
> This proposal jumps straight into the thick of implementation, but I
> don't think I've seen a motivation of why coroutines need to be
> represented at the LLVM IR level. Can't this transform be performed
> entirely in the front-end?
>
> Vadim
>
> On Thu, Jul 14, 2016 at 9:28 PM, Gor Nishanov via llvm-dev
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
> Hi David:
>
> >> How do you deal with basic blocks which appear to be used by
> multiple parts
> >> of the coroutine? We handled this in WinEHPrepare by cloning
> any BBs which
> >> were shared.
>
> I experimented with several approaches, but, cloning ended up
> being the simplest
> and most reliable. Suspend points express three different control
> flows that
> can happen at the suspend point: a suspension (default),
> resumption (0) and
> destruction (1).
>
> %0 = call i8 @llvm.coro.suspend([..])
> switch i8 %0, label %suspend [i8 0, label %resume,
> i8 1, label %destroy]
>
> I slap a switch that jumps to all suspend points in the function.
> Then I clone
> the function twice (one will become resume clone, and another
> destroy clone).
> This switch becomes the entry block in the clones. Then, I RAUW
> coro.suspends
> with -1, 0, or 1 (in original, resume and destroy clones
> respectively) and let
> SimplifyCFG do the rest. (This is slightly simplified explanation,
> but it should
> give the idea).
>
> >> I would remove the attribute. There are all sorts of tricks
> you can do to
> >> avoid scanning the function for calls to the intrinsic. For
> example, you
> >> can see if a declaration of your intrinsic exists and, if so,
> if it has an
> >> users in the function in question (under the assumption that
> there are few).
>
> Aye-aye. Will remove the attribute.
>
> With respect to lessening the impact of coroutine passes, one
> approach I tried
> was to look during doInitialize whether there are any uses of
> coroutine
> intrinsics and set a flag if there are any, or maybe build a set
> of functions
> with coroutines intrinsics in doInitialize, so that in
> runOnFunction, I can just
> check whether the function is in the set and skip if it is not.
>
> Then, I scared myself silly that some optimization passes can
> materialize
> new functions or new function bodies and I will miss them. So I
> stopped doing
> that.
>
> I think your approach takes care of my "materialization" concern.
> (BTW, I don't
> even know if that is a real concern). But may not be profitable if
> there are a
> lot of small functions that are faster to scan for coroutine
> intrinsics then to
> scan potentially longer list of coroutine intrinsics users.
>
> BTW, Do you have a preference on how to restart CGSCC pipeline?
> One of the four
> options I listed (repeated in P.S), or even some better way I did
> not think
> about?
>
> Thank you,
> Gor
>
> P.S.
>
> Option 1: https://reviews.llvm.org/D21569 (no longer relevant,
> since we are
> removing
> AttrKind::Coroutine)
> Option 2: https://reviews.llvm.org/D21570 (bool& Devirt in runSCC)
> Option 3: https://reviews.llvm.org/D21572 (virtual bool
> restatedRequested())
> Option 4: Fake devirtualized call in a function pass, so that
> RefreshSCC will
> detect devirtualization and restart the pipeline by itself.
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://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/20160718/932bc991/attachment-0001.html>
More information about the llvm-dev
mailing list