This avoids the odd cases where gimple_register_canonical_type could
end up running in cycles.  I was able to reproduce this issue
with an intermediate tree and LTO bootstrap.  While the following
patch is not the "real" fix (that one runs into a known cache-preloading
issue again ...) it certainly makes a lot of sense and avoids
the issue by design.

LTO bootstrapped on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2011-05-17  Richard Guenther  <rguent...@suse.de>

        * gimple.c (gimple_register_canonical_type): Use the main-variant
        leader for computing the canonical type.

Index: gcc/gimple.c
===================================================================
*** gcc/gimple.c        (revision 173825)
--- gcc/gimple.c        (working copy)
*************** gimple_register_canonical_type (tree t)
*** 4856,4874 ****
    if (TYPE_CANONICAL (t))
      return TYPE_CANONICAL (t);
  
!   /* Always register the type itself first so that if it turns out
!      to be the canonical type it will be the one we merge to as well.  */
!   t = gimple_register_type (t);
  
    if (TYPE_CANONICAL (t))
      return TYPE_CANONICAL (t);
  
-   /* Always register the main variant first.  This is important so we
-      pick up the non-typedef variants as canonical, otherwise we'll end
-      up taking typedef ids for structure tags during comparison.  */
-   if (TYPE_MAIN_VARIANT (t) != t)
-     gimple_register_canonical_type (TYPE_MAIN_VARIANT (t));
- 
    if (gimple_canonical_types == NULL)
      gimple_canonical_types = htab_create_ggc (16381, 
gimple_canonical_type_hash,
                                              gimple_canonical_type_eq, 0);
--- 4856,4869 ----
    if (TYPE_CANONICAL (t))
      return TYPE_CANONICAL (t);
  
!   /* Use the leader of our main variant for determining our canonical
!      type.  The main variant leader is a type that will always
!      prevail.  */
!   t = gimple_register_type (TYPE_MAIN_VARIANT (t));
  
    if (TYPE_CANONICAL (t))
      return TYPE_CANONICAL (t);
  
    if (gimple_canonical_types == NULL)
      gimple_canonical_types = htab_create_ggc (16381, 
gimple_canonical_type_hash,
                                              gimple_canonical_type_eq, 0);

Reply via email to