Support ofsetted parameters in local modref
Jan Hubicka
hubicka@ucw.cz
Wed Oct 14 10:18:52 GMT 2020
> Hi,
>
> On Wed, Oct 14 2020, Jan Hubicka wrote:
> > Hi,
> > here is updated patch with cap on number of iterations.
> > I set the limit to 8 and bootstrapped it with additional assert that the
> > limit is not met, it did not fire.
> >
> > Bootstrapped/regtested x86_64-linux, OK?
> >
> > gcc/ChangeLog:
> >
> > 2020-10-14 Jan Hubicka <hubicka@ucw.cz>
> >
> > * doc/invoke.texi: (ipa-jump-function-lookups): Document param.
> > * ipa-modref.c (merge_call_side_effects): Use
> > unadjusted_ptr_and_unit_offset.
> > * ipa-prop.c (unadjusted_ptr_and_unit_offset): New function.
> > * ipa-prop.h (unadjusted_ptr_and_unit_offset): Declare.
> > * params.opt: (-param-ipa-jump-function-lookups): New.
> >
> > diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
> > index 2d09d913051..cf3da6a6568 100644
> > --- a/gcc/ipa-prop.c
> > +++ b/gcc/ipa-prop.c
> > @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "domwalk.h"
> > #include "builtins.h"
> > #include "tree-cfgcleanup.h"
> > +#include "options.h"
> >
> > /* Function summary where the parameter infos are actually stored. */
> > ipa_node_params_t *ipa_node_params_sum = NULL;
> > @@ -1222,6 +1223,73 @@ load_from_unmodified_param_or_agg (struct ipa_func_body_info *fbi,
> > return index;
> > }
> >
> > +/* Walk pointer adjustemnts from OP (such as POINTER_PLUS and ADDR_EXPR)
> > + to find original pointer. Initialize RET to the pointer which results from
> > + the walk.
> > + If offset is known return true and initialize OFFSET_RET. */
> > +
> > +bool
> > +unadjusted_ptr_and_unit_offset (tree op, tree *ret, poly_int64 *offset_ret)
> > +{
> > + poly_int64 offset = 0;
> > + bool offset_known = true;
> > + int i;
> > +
> > + for (i = 0; i < param_ipa_jump_function_lookups; i++)
> > + {
> > + if (TREE_CODE (op) == ADDR_EXPR)
> > + {
> > + poly_int64 extra_offset = 0;
> > + tree base = get_addr_base_and_unit_offset (TREE_OPERAND (op, 0),
> > + &offset);
> > + if (!base)
> > + {
> > + base = get_base_address (TREE_OPERAND (op, 0));
> > + if (TREE_CODE (base) != MEM_REF)
> > + break;
> > + offset_known = false;
>
> Umm, did you really intend to clear offset_known only after the break?
> (I may not understand the nuances of the get_base... functions but it
> strikes me as odd.)
Yes, offset_known relates to op.
We try tolookup base and if it is MEM_REF we will be able to update op.
If this is a decl or something else we thus need to give up (since we
are required to return pointer). So in first case we will return current
op for which offset_known stil lapplies, however if we found MEM_REF we
will update op but lose track of offset, since
get_addr_base_and_unit_offset failed.
Honza
>
> Thanks,
>
> Martin
More information about the Gcc-patches
mailing list