[cfe-dev] [llvm-dev] RFC: Supported Optimizations attribute
John McCall via cfe-dev
cfe-dev at lists.llvm.org
Tue Dec 4 11:33:20 PST 2018
On 4 Dec 2018, at 11:16, Finkel, Hal J. wrote:
> On 12/4/18 1:49 AM, John McCall via cfe-dev wrote:
>
> On 4 Dec 2018, at 1:45, Sanjoy Das wrote:
>
> I think we should have some bounds on how "badly" a
> supported_optimizations tag on a function can affect its semantics.
> For instance, can a "supported_optimizations" invariant be that "the
> CFG is always structured"? Or (exaggerating to illustrate the point)
> "the function has an equal number of loads and stores"?
>
> Piotr's proposal unfortunately doesn't give us a good name for the
> class
> of optimizations that require being listed in supported_optimizations.
> In earlier discussions I called them "brittle", but I can understand
> why
> nobody wants to call their optimization that, so let's call them
> "good-faith optimizations" instead since they rely on the good faith
> of
> all the participating code.
>
> Every optimization has to know how to maintain the structural rules of
> LLVM IR; that's what makes them structural rules. We don't want the
> set of
> structural rules to substantially change because such-and-such
> good-faith
> optimization is in effect because that would require arbitrary
> transforms
> to check the supported_optimizations list before they knew which rules
> to
> follow. Instead, the burden is on the optimization designer to pick IR
> constructs that won't be messed up by an arbitrary transform with no
> special
> knowledge of the optimization. The only thing the optimization
> designer
> can rely on is this:
>
> * other transforms will preserve the apparent semantics of the
> function and
> * other transforms will maintain the standard structural rules of
> LLVM IR.
>
> For example, if you need arbitrary side-effects to not be re-ordered
> past
> some point in the function, you should put an instruction there that
> inhibits that kind of code motion, probably by making it look like a
> call
> to an unknown function. No transform can reorder arbitrary
> side-effects
> across such a call because doing so might change the apparent
> semantics of
> the program. Similarly, if you need a direct use-def link between two
> points in the function, you should make the first point define a token
> that'll be used by the second point. No transform will break or
> abstract
> that association because that would violate the basic structural rules
> of IR.
> If there's a structural rule that can't be expressed with the current
> tools
> of IR, we can talk about how to fix that --- although tokens are such
> a big
> hammer that I'd be somewhat surprised to hear that something really
> can't
> be expressed at all (but much less surprised to hear that the token
> rules
> are too strong and we'd like other transforms to have more power to
> change
> the code).
>
> So the defining property of a good-faith optimization is that:
> - there are rules which participating functions are expected to follow
> on
> pain of undefined behavior but which LLVM IR doesn't require every
> function
> to follow, and
> - those rules will be preserved by any transform that doesn't move
> code
> between functions and which preserves the apparent function semantics
> and maintains the standard structural rules of LLVM IR.
>
> I like these conditions, in terms of bounding what this means.
>
> We might need to be more explicit about what moves code means, as
> we're run into fuzzy lines before around inter-procedural
> optimizations (e.g., return-value propagation, using the 'returned'
> attribute, and variants). Would it work to say "move code with
> potential side effects"?
That's a really good point. Applying this to our current use-case, I'm
pretty
sure that both return-value propagation and the `returned` attribute can
break
Piotr's devirtualization optimization, so they need to intersect the
caller's
list or clear it, respectively. IIRC it used to be the case that
`returned`
was mostly honored in the backend for liveness optimizations, i.e. long
after
IR constructs like supported_optimizations have stopped being relevant,
so
being very pessimistic about it is fine; but I don't know if that's
still true.
John.
>
> Thanks again,
>
> Hal
>
> I think that answers your question about what sort of rules we can
> expect
> supported_optimizations to guarantee.
>
> John.
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org<mailto:cfe-dev at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
> --
> Hal Finkel
> Lead, Compiler Technology and Programming Languages
> Leadership Computing Facility
> Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20181204/b111bfa4/attachment.html>
More information about the cfe-dev
mailing list