On Tue, 3 Nov 2015, Tom de Vries wrote: > On 03/11/15 16:08, Richard Biener wrote: > > On Tue, 3 Nov 2015, Tom de Vries wrote: > > > > > On 01/11/15 19:20, Tom de Vries wrote: > > > > On 01/11/15 19:03, Tom de Vries wrote: > > > > > So, the new patch series is: > > > > > > > > > > 1 Rename make_restrict_var_constraints to > > > > > make_param_constraints > > > > > 2 Handle recursive restrict in function parameter > > > > > > > > > > I'll repost in reply to this message. > > > > > > > > > > > > > This patch adds handling of all the restrict qualifiers in the type of a > > > > function parameter. > > > > > > > > > > And reposting an updated version, now that the toplevel parameter in > > > make_param_constraints has been eliminated. > > > > @@ -5195,6 +5197,8 @@ struct fieldoff > > unsigned may_have_pointers : 1; > > > > unsigned only_restrict_pointers : 1; > > + > > + varinfo_t restrict_var; > > }; > > > > store the varinfo ID here, 'unsigned int restrict_var' which ends > > up not changing fieldoff size. get_varinfo (restrict_var) will get > > you the varinfo_t. > > Done, attached. > > > > > @@ -5374,6 +5380,19 @@ push_fields_onto_fieldstack (tree type, > > vec<fieldoff_s> *fieldstack, > > = (!has_unknown_size > > && POINTER_TYPE_P (field_type) > > && TYPE_RESTRICT (field_type)); > > + if (handle_param > > + && e.only_restrict_pointers > > + && !type_contains_placeholder_p (TREE_TYPE > > (field_type))) > > + { > > + varinfo_t rvi; > > + tree heapvar = build_fake_var_decl (TREE_TYPE > > (field_type)); > > + DECL_EXTERNAL (heapvar) = 1; > > + rvi = create_variable_info_for_1 (heapvar, > > "PARM_NOALIAS", > > + true, true); > > + rvi->is_restrict_var = 1; > > + insert_vi_for_tree (heapvar, rvi); > > + e.restrict_var = rvi; > > + } > > > > hmm, can you delay this to the point we actually will use field-sensitive > > stuff? That is, until create_variable_info_for_1 decided to use a > > multi-field variable? > > AFAIU your concern is that in the current patch we're creating heapvars that > may end up being ignored, f.i. if we hit the MAX_FIELDS_FOR_FIELD_SENSITIVE > threshold?
Yes (or for other reasons). > > Say, here: > > > > + if (handle_param > > + && newvi->only_restrict_pointers > > + && fo->restrict_var != NULL) > > + { > > + make_constraint_from (newvi, fo->restrict_var->id); > > + make_param_constraints (fo->restrict_var); > > + } > > > > ? Looks like then you don't need the new field at all. > > > > The build_fake_var_decl call needs TREE_TYPE (field_type), the type the > restrict pointer field points to. > > The field type is no longer available once we've abstracted the struct type > into a field stack in create_variable_info_for_1. > > I think I can postpone the creation of the heapvar till where you suggest in > create_variable_info_for_1, but I'd still need a means > to communicate the TREE_TYPE (field_type) from push_fields_onto_fieldstack to > create_variable_info_for_1. > > A simple implementation would be a new field: > ... > @@ -5195,6 +5197,8 @@ struct fieldoff > unsigned may_have_pointers : 1; > > unsigned only_restrict_pointers : 1; > + > + tree restrict_pointed_type; > }; > ... > Which AFAIU will change fieldoff size. It's ok to change fieldoff size if there is a reason to ;) Patch is ok along this line. Thanks, Richard.