[PATCH] Improve PR85574
Richard Biener
rguenther@suse.de
Wed Jan 2 08:50:00 GMT 2019
On Fri, 21 Dec 2018, Richard Biener wrote:
>
> It looks like IPA ICF does code generation based on the order of
> a hahstable walk which is keyed on pointers. That's a no-no.
> Fixing that doesn't solve the cc1 miscompare for LTO bootstrap
> but at least the IPA ICF WPA dumps are now consistent between
> stages.
>
> [LTO] Bootstrapped and tested on x86_64-unknown-linux-gnu, ok
> for trunk (and branches)?
Now applied to trunk. Will continue poking at PR85574 after
digging through backlog.
Richard.
> Will only get to applying after Christmas holidays so in case
> you want to poke further feel free to apply yourself.
>
> Thanks,
> Richard.
>
> 2018-12-21 Richard Biener <rguenther@suse.de>
>
> PR ipa/85574
> * ipa-icf.h (sem_item_optimizer::sort_congruence_split): Declare.
> * ipa-icf.c (sem_item_optimizer::sort_congruence_split): New
> function.
> (sem_item_optimizer::do_congruence_step_f): Sort the congruence
> set after UIDs before splitting them.
>
> Index: gcc/ipa-icf.c
> ===================================================================
> --- gcc/ipa-icf.c (revision 267301)
> +++ gcc/ipa-icf.c (working copy)
> @@ -3117,6 +3117,18 @@ sem_item_optimizer::traverse_congruence_
> return true;
> }
>
> +int
> +sem_item_optimizer::sort_congruence_split (const void *a_, const void *b_)
> +{
> + const std::pair<congruence_class *, bitmap> *a = (const std::pair<congruence_class *, bitmap> *)a_;
> + const std::pair<congruence_class *, bitmap> *b = (const std::pair<congruence_class *, bitmap> *)b_;
> + if (a->first->id < b->first->id)
> + return -1;
> + else if (a->first->id > b->first->id)
> + return 1;
> + return 0;
> +}
> +
> /* Tests if a class CLS used as INDEXth splits any congruence classes.
> Bitmap stack BMSTACK is used for bitmap allocation. */
>
> @@ -3157,13 +3169,20 @@ sem_item_optimizer::do_congruence_step_f
> }
> }
>
> + auto_vec<std::pair<congruence_class *, bitmap> > to_split;
> + to_split.reserve_exact (split_map.elements ());
> + for (hash_map <congruence_class *, bitmap>::iterator i = split_map.begin ();
> + i != split_map.end (); ++i)
> + to_split.safe_push (*i);
> + to_split.qsort (sort_congruence_split);
> +
> traverse_split_pair pair;
> pair.optimizer = this;
> pair.cls = cls;
>
> splitter_class_removed = false;
> - split_map.traverse <traverse_split_pair *,
> - sem_item_optimizer::traverse_congruence_split> (&pair);
> + for (unsigned i = 0; i < to_split.length (); ++i)
> + traverse_congruence_split (to_split[i].first, to_split[i].second, &pair);
>
> /* Bitmap clean-up. */
> split_map.traverse <traverse_split_pair *,
> Index: gcc/ipa-icf.h
> ===================================================================
> --- gcc/ipa-icf.h (revision 267301)
> +++ gcc/ipa-icf.h (working copy)
> @@ -599,6 +599,8 @@ private:
> bitmap const &b,
> traverse_split_pair *pair);
>
> + static int sort_congruence_split (const void *, const void *);
> +
> /* Reads a section from LTO stream file FILE_DATA. Input block for DATA
> contains LEN bytes. */
> void read_section (lto_file_decl_data *file_data, const char *data,
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)
More information about the Gcc-patches
mailing list