Fix canonical types of atomic types

Martin Liška mliska@suse.cz
Wed Feb 27 08:19:00 GMT 2019


PING^1

On 2/10/19 6:21 PM, Jan Hubicka wrote:
> Hi,
> build_qualified_type adjusts alignment of atomic types to one of minimal
> alignment needed for atomic operations (I think it does so). For packed
> structures this leads to type variant to be created and alignment to be
> updated later.
> 
> If you call again build_qualified_type on packed structures, it won't
> reuse existing type because check_base_type will compare alignment of
> the base type (which is not atomic and has smaller alignment) and will
> end up creating new variant.
> 
> When constructing a canonical types C frontned relies on types being
> shared and this eventually leads to ice in type simplification.
> 
> I think it is easiest to teach check_base_type about minimal alignment.
> 
> Bootstrapped/regtested x86_64-linux.
> 	PR lto/88585
> 	* tree.c (find_atomic_core_type): Forward declare.
> 	(check_base_type): Correctly compare alignments of atomic types.
> Index: tree.c
> ===================================================================
> --- tree.c	(revision 268742)
> +++ tree.c	(working copy)
> @@ -6329,18 +6329,33 @@ check_lang_type (const_tree cand, const_
>    return lang_hooks.types.type_hash_eq (cand, base);
>  }
>  
> +static tree find_atomic_core_type (const_tree type);
> +
>  /* Returns true iff unqualified CAND and BASE are equivalent.  */
>  
>  bool
>  check_base_type (const_tree cand, const_tree base)
>  {
> -  return (TYPE_NAME (cand) == TYPE_NAME (base)
> -	  /* Apparently this is needed for Objective-C.  */
> -	  && TYPE_CONTEXT (cand) == TYPE_CONTEXT (base)
> -	  /* Check alignment.  */
> -	  && TYPE_ALIGN (cand) == TYPE_ALIGN (base)
> -	  && attribute_list_equal (TYPE_ATTRIBUTES (cand),
> -				   TYPE_ATTRIBUTES (base)));
> +  if (TYPE_NAME (cand) != TYPE_NAME (base)
> +      /* Apparently this is needed for Objective-C.  */
> +      || TYPE_CONTEXT (cand) != TYPE_CONTEXT (base)
> +      || !attribute_list_equal (TYPE_ATTRIBUTES (cand),
> +			        TYPE_ATTRIBUTES (base)))
> +    return false;
> +  /* Check alignment.  */
> +  if (TYPE_ALIGN (cand) == TYPE_ALIGN (base))
> +    return true;
> +  /* Atomic types increase minimal alignment.  We must to do so as well
> +     or we get duplicated canonical types. See PR88686.  */
> +  if ((TYPE_QUALS (cand) & TYPE_QUAL_ATOMIC))
> +    {
> +      /* See if this object can map to a basic atomic type.  */
> +      tree atomic_type = find_atomic_core_type (cand);
> +      if (TYPE_ALIGN (atomic_type) == TYPE_ALIGN (cand)
> +	  && TYPE_ALIGN (base) < TYPE_ALIGN (cand))
> +       return true;
> +    }
> +  return false;
>  }
>  
>  /* Returns true iff CAND is equivalent to BASE with TYPE_QUALS.  */
> @@ -6373,7 +6388,7 @@ check_aligned_type (const_tree cand, con
>     atomic types, and returns that core atomic type.  */
>  
>  static tree
> -find_atomic_core_type (tree type)
> +find_atomic_core_type (const_tree type)
>  {
>    tree base_atomic_type;
>  
> 



More information about the Gcc-patches mailing list