[PATCH 1/2] IPA ICF: rewrite references into a hash_map.
Martin Liška
mliska@suse.cz
Mon Jun 3 13:56: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.
Martin
>
> Honza
More information about the Gcc-patches
mailing list