[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