[PATCH 1/2] IPA ICF: rewrite references into a hash_map.
Jan Hubicka
hubicka@ucw.cz
Mon Jun 3 14:07:00 GMT 2019
> On 6/3/19 3:48 PM, Jan Hubicka wrote:
> > If I get it right, this replaces reference vectors by a central hash
> > map.
>
> Yes
>
> > I wonder when you need to many querries to them? I would expect
> > the subdividing algorithm to travel the reference lists quite
> > sequentially...
>
> The issue is that if you have a function 'foo' that calls 'bar' let's say 1000x.
> Then imagine 'baz' having only one function call and it calls 'bar'.
>
> Then if you divide by 'bar' (by all references of 'bar'), you end up here:
>
> 3131 /* Tests if a class CLS used as INDEXth splits any congruence classes.
> 3132 Bitmap stack BMSTACK is used for bitmap allocation. */
> 3133
> 3134 void
> 3135 sem_item_optimizer::do_congruence_step_for_index (congruence_class *cls,
> 3136 unsigned int index)
> 3137 {
> 3138 hash_map <congruence_class *, bitmap> split_map;
> 3139
> 3140 for (unsigned int i = 0; i < cls->members.length (); i++)
> 3141 {
> 3142 sem_item *item = cls->members[i];
> 3143
> 3144 /* Iterate all usages that have INDEX as usage of the item. */
> 3145 for (unsigned int j = 0; j < item->usages.length (); j++)
> 3146 {
> 3147 sem_usage_pair *usage = item->usages[j];
> 3148
> 3149 if (usage->index != index)
> 3150 continue;
>
> And the function will be called 1000x with index = [0, 999]. And then we have linear
> search at line 3145 that will most commonly return with false at 3149 because function
> 'baz' has only a call with index == 0. That's why it's so slow and why hash_table
> help significantly.
Aha, I see. You have one equivalence class and you know that index has
changed and you are looking up if given function use it.
Patch is OK,
Honza
>
> Martin
>
> >
> > Honza
>
More information about the Gcc-patches
mailing list