[llvm-dev] RFC: Strong GC References in LLVM

Daniel Berlin via llvm-dev llvm-dev at lists.llvm.org
Fri Jul 15 15:53:51 PDT 2016


On Fri, Jul 15, 2016, 3:38 PM Sanjoy Das <sanjoy at playingwithpointers.com>
wrote:

> Hi Daniel,
>
> Daniel Berlin wrote:
>  >     /* Add fake edges to the function exit for any non constant and non
>  >          noreturn calls (or noreturn calls with EH/abnormal edges),
>  >          volatile inline assembly in the bitmap of blocks specified by
>  >     BLOCKS
>  >          or to the whole CFG if BLOCKS is zero.
>  >     ...
>  >
>  >          The goal is to expose cases in which entering a basic block
> does
>  >          not imply that all subsequent instructions must be executed.
> */
>  >
>  >
>  > Note that this is also necessary to makes post-dominance correct (but we
>  > already do it in most cases, but i think there are still bugs open about
>  > correctness)
>
> Yeah, right now in LLVM we cannot rely on post-dominance to conclude
> "guaranteed to execute" which isn't ideal.  There's at least one place
> I know where a more precise post-dominance could be used. :)
>
>  > For dominance, the dominance relationship for exit blocks a noreturn
>  > blocks reach also changes , though i don't honestly remember if it's
>  > material or not, and i'm a bit lazy to think about it.  But here's an
>  > example:
>  >
>  >
>  > IE given
>  >
>  > A (may-throw)
>  > |
>  > v
>  > B
>  > |
>  > v
>  > C (exit)
>  >
>  >
>  > Here, we have A dominates B dominates C
>  >
>  > So the dominator tree is
>  > A
>  > |
>  > v
>  > B
>  > |
>  > v
>  > C
>  >
>  > Now, if you add an edge from A to C, you have:
>  >
>  > A dominates B
>  > Neither B nor A dominate C (C's idom is somewhere above, so it's in a
>  > sibling tree somewhere).
>
> Not sure I understand this example -- won't C's new idom be A?  The new
> graph is this, right:
>
> A -> C
> A -> B
> B -> C
>
> ?
>

Yes I originally constructed the graph with two blocks with may throw
calls, then simplified it and screwed up. Such is Friday 😀
I noticed right after I sent it and left for the day but not before you
caught it.

>
>  >
>  >
>  > IE
>  >
>  > A    C
>  >   |
>  > B
>  >
>  >
>  > In GCC, there is a single exit block, and it is always empty (returns
>  > are connected to the exit block).
>  > Thus, the above will not prevent an optimization that should otherwise
>  > happen, from happening.
>  >
>  > Because LLVM's exit blocks contain real code, it may
>  >
>  > You can actually get even worse (ie really wrong) situations if the
>  > "exit" blocks somehow have successors, but thankfully we don't have a
>  > case where that happens that i know :)
>  >
>  >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160715/d1b6a3c2/attachment.html>


More information about the llvm-dev mailing list