On Tue, Nov 3, 2020 at 5:21 PM Erick Ochoa
<erick.oc...@theobroma-systems.com> wrote:
>
> Thanks for the review Richard I'll address what I can. I also provide
> maybe some hindsight into some of the design decisions here. I'm not
> trying to be defensive just hoping to illuminate why some decisions were
> made and how some criticisms may fail to really address the reason why
> these designs were made.
>
> On 03/11/2020 15:58, Richard Biener wrote:
> > On Fri, Oct 30, 2020 at 6:44 PM Erick Ochoa
> > <erick.oc...@theobroma-systems.com> wrote:
> >>
> >> Hello again,
> >>
> >> I've been working on several implementations of data layout
> >> optimizations for GCC, and I am again kindly requesting for a review of
> >> the type escape based dead field elimination and field reorg.
> >>
> >> Thanks to everyone that has helped me. The main differences between the
> >> previous commits have been fixing the style, adding comments explaining
> >> classes and families of functions, exit gracefully if we handle unknown
> >> gimple syntax, and added a heuristic to handle void* casts.
> >>
> >> This patchset is organized in the following way:
> >>
> >> * Adds a link-time warning if dead fields are detected
> >> * Allows for the dead-field elimination transformation to be applied
> >> * Reorganizes fields in structures.
> >> * Adds some documentation
> >> * Gracefully does not apply transformation if unknown syntax is detected.
> >> * Adds a heuristic to handle void* casts
> >>
> >> I have tested this transformations as extensively as I can. The way to
> >> trigger these transformations are:
> >>
> >> -fipa-field-reorder and -fipa-type-escape-analysis
> >>
> >> Having said that, I welcome all criticisms and will try to address those
> >> criticisms which I can. Please let me know if you have any questions or
> >> comments, I will try to answer in a timely manner.
> >>
> >> The code is in:
> >>
> >>     refs/vendors/ARM/heads/arm-struct-reorg-wip
> >>
> >> Future work includes extending the current heuristic with ipa-modref
> >> extending the analysis to use IPA-PTA as discussed previously.
> >>
> >> Few notes:
> >>
> >> * Currently it is not safe to use -fipa-sra.
> >> * I added some tests which are now failing by default. This is because
> >> there is no way to safely determine within the test case that a layout
> >> has been transformed. I used to determine that a field was eliminated
> >> doing pointer arithmetic on the fields. And since that is not safe, the
> >> analysis decides not to apply the transformation. There is a way to deal
> >> with this (add a flag to allow the address of a field to be taken) but I
> >> wanted to hear other possibilities to see if there is a better option.
> >> * At this point we’d like to thank the again GCC community for their
> >> patient help so far on the mailing list and in other channels. And we
> >> ask for your support in terms of feedback, comments and testing.
> >
> > I've only had a brief look at the branch - if you want to even have a
> > remote chance of making this stage1 you should break the branch
> > up into a proper patch series and post it with appropriate ChangeLogs
> > and descriptions.
> >
> > First, standard includes may _not_ be included after including system.h,
> > in fact, they _need_ to be included from system.h - that includes
> > things like <vector> or <map>.  There are "convenient" defines you
> > can use like
> >
> > #define INCLUDE_SET
> > #include "system.h"
> >
> > and system.h will do what you want.  Not to say that you should
> > use GCCs containers and not the standard library ones.
>
> Thanks I didn't know this!
>
> >
> > You expose way too many user-visible command-line options.
>
> Yes, I can certainly remove some debugging flags.
>
> >
> > All the stmt / tree walking "meta" code should be avoided - it
> > would need to be touched each time we change GIMPLE or
> > GENERIC.  Instead use available walkers if you really need
> > it in such DFS-ish way.
>
> There are two points being made here:
> 1. Use the available walkers
> 2. Changing gimple would imply changes to your code
>
> First:
>
> I did tried using the available walkers in the past, and the walk_tree
> function does not contain a post-order callback. We really need to
> propagate information from the gimple leaf nodes back to the root, and
> as a way to achieve this (and probably other things like maintaining a
> stack of the nodes visited to reach the current node) we really need a
> post-order callback.
>
> We did have a conversation about this where you pointed out this pattern:
>
>   *walk_subtrees = 0;
>   walk_tree (.. interesting subexpressions ... );
>   do post-order work
>
> In the preorder hook, but this only works with simple expressions and we
> need more complicated machinery.
>
> Furthermore, I did look into extending the current walk_tree function
> with post-order callbacks but due to implementation details in the
> function (tail-recursion), we both agreed that having both
> tail-recursion AND a post-order hook was impossible.

Yes, I remember the discussion.  Still GIMPLE is "flat", there's
no need to have a DFS walk at all, if then you need it for
access paths on memory reference trees but those are
linear (the TREE_OPERAND (.., 0) chain).

The way the code is structured makes it really hard to spot
what is wrong about it and nail down the fact, leading to
the simplification I expect is possible :/

> Second:
>
> I would expect any transformation that performs an analysis in an IR be
> needing to at least be re-reviewed somehow when the IR is re-written. I
> also don't think extending the base visitor classes would be too difficult.
>
> >
> > That "IPA SRA is not safe" is of course not an option but hints
> > at a shortcoming in your safety analysis.
>
> I looked into how to make this transformation safe with IPA-SRA in the
> past. I don't think it is really that big of a short-coming. I was told
> that I could look at cgraph_node->clone.param_adjustments and find out
> how the parameters are being adjusted. I will certainly work on this,
> however, due to exploring the feasibility of using a points-to-analysis
> instead of a type-based escape analysis to drive this transformation,
> making this transformation safe with IPA SRA had to be put on the back
> burner.
>
> So, overall, yes, I agree that it would be better if this transformation
> worked with IPA-SRA and I also think it can be done.

As long as IPA-SRAs doing is handled conservatively and
having IPA SRA enabled does not disable all of DFE out of
caution you can probably deal with this later.

> >
> > In DFE in handle_pointer_arithmetic_constants you
> > look at the type of an operand - that's not safe since
> > this type doesn't carry any semantics.
>
> What exactly do you mean by this "not carry any semantics"? If we are
> modifying a type, a type carries the semantics of how big the expected
> type is. So I at least need to know whether the pointer arithmetic
> affects a type I modified and if that's the case how big the previous
> type was and how smaller it is once the fields are deleted.
>
> Can you be more concrete and point out the specific line of code? I
> think I have covered all cases here, but I just want to be really sure.

In GIMPLE you could replace all pointer types of SSA names with void *
and that would not make the IL invalid or change its semantics.  You
won't ever see a cast from one pointer type to another in GIMPLE for
example (because such cast would be pointless).  That means
expecting a type that appears in source to still appear in GIMPLE
is wrong.

As said it's hard to see how the particular DFS  walk worker affects
the state, I just spotted that you do type queries on operands of
pointer arithmetic.  You can simplify this by assuming the type
is void * and the outcome must not change the validity of your
analysis.

> >
> > The DFE code is really hard to follow since it diverges
> > from GCC style which would do sth like the following
> > to iterate over all stmt [operands]:
> >
> > FOR_EACH_BB_FN (fun, bb)
> >    {
> >       for (auto gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next 
> > (&gsi))
> >          walk PHIs
> >       for (auto gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
> >          walk stmts, for example via walk_gimple_stmt ()
> >    }
> >
> > and I'd expect a single visitor with a switch () over the gimple/operation
> > kind rather than gazillion overloads I have no idea what they exactly
> > visit and how.
>
> We could certainly flatten the visitors into a single larger visitor.
> The idea is to maintain a separation between statements, expressions,
> and types. That is why there are visitors for statements, expressions
> and types. And sure, each stage of the analysis might need slightly
> different ways to model gimple, so there are several derived classes.
>
> Again, this was a design decision and I'm not married to it. I will try
> to refactor it to have a larger visitor.
>
> >
> > In a later change on the branch I see sth like ABORT_IF_NOT_C
> > where I'm not sure what this is after - you certainly can handle
> > IL constructs you do not handle conservatively (REFERENCE_TYPE
> > is the same as POINTER_TYPE - they are exchangable for the
> > middle-end, METHOD_TYPE is the same as FUNCTION_TYPE,
> > a QUAL_UNION_TYPE is not semantically different from
> > a UNION_TYPE for the middle-end it only differs in layout handing.
>
> Originally I wrote these transformations with a lot of assertions to
> make fuzzying easier. In my experience, I have not seen REFERENCE_TYPE,
> QUAL_UNION_TYPE, nor METHOD_TYPE being generated from C code. Could we
> handle these gimple types in the future? Sure! I'd be happy to
> contribute such changes. However, since this optimization was written
> mostly targetting C code, I would need some time to revisit the
> assumptions that were made at the time and make sure that the
> implementation does not break. So, instead, at the moment, if we detect
> something that is not normally seen in "Gimple from C", we will abort
> and exit the optimization / analysis without transforming anything.
>
> >
> > I see you only want to replace the void * "coloring" with modref
> > so you'll keep using "IPA type escape analysis".  I don't think
> > that's good to go.
>
> I don't want to use modref only to replace the void* "coloring"
> heuristic. What I want is to use IPA-PTA to avoid using the IPA type
> escape analysis, however the level of precision for IPA-PTA needed for
> such things is not enough at the moment. I believe that using modref in
> the IPA type escape analysis, while the infrastructure for IPA-PTA grows
> is the best way to go forward. It gives me more experience writing
> transformations following the style that the community likes, learn
> about infrastructure available in GCC, and provides a way to test the
> future implementation (i.e., we can test the IPA-PTA implementation
> against the type-escape implementation).

Fair enough for the purpose you lay out but I think we agreed that
using sth like type escape is not what we want to have.

> Again, thank you very much for the review! It will be hard for me to
> address some of these concerns in a timely manner. I would appreciate if
> we can continue having some discussion about the design decisions I made
> and whether or not they do make sense and maybe are enough to address
> some concerns. Otherwise, I'll just try my best to address the concerns
> listed here by changing the implementation.
>
> >
> > Richard.
> >

Reply via email to