PATCH: PR target/46195: r165965 regresses i386 darwin

Jack Howarth howarth@bromo.med.uc.edu
Sat Oct 30 09:22:00 GMT 2010


On Fri, Oct 29, 2010 at 10:42:22AM -0700, H.J. Lu wrote:
> 
> Here is the updated patch  Jack, could you please test it on Darwin?
> OK for trunk if there are no regressions on Linux and Darwin?
> 
> Thanks.
> 

H.J.,
   This latest version of the patch still eliminates all of the regressions
from PR 46195 on x86_64-apple-darwin10.
           Jack

> -- 
> H.J.
> ---
> 2010-10-29  H.J. Lu  <hongjiu.lu@intel.com>
> 
> 	PR target/46195
> 	* config/i386/i386.c (contains_aligned_value_p): Renamed to ...
> 	(ix86_compat_aligned_value_p): This.
> 	(ix86_old_function_arg_boundary): Updated.
> 	(ix86_contains_aligned_value_p): New.
> 	(ix86_function_arg_boundary): Align long double parameters on
> 	stack to 4byte in 32bit.

> 2010-10-29  H.J. Lu  <hongjiu.lu@intel.com>
> 
> 	PR target/46195
> 	* config/i386/i386.c (contains_aligned_value_p): Renamed to ...
> 	(ix86_compat_aligned_value_p): This.
> 	(ix86_old_function_arg_boundary): Updated.
> 	(ix86_contains_aligned_value_p): New.
> 	(ix86_function_arg_boundary): Align long double parameters on
> 	stack to 4byte in 32bit.
> 
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index f2bd705..4fa038e 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -6952,10 +6952,12 @@ ix86_pass_by_reference (CUMULATIVE_ARGS *cum ATTRIBUTE_UNUSED,
>    return 0;
>  }
>  
> -/* Return true when TYPE should be 128bit aligned for 32bit argument passing
> -   ABI.  */
> +/* Return true when TYPE should be 128bit aligned for 32bit argument
> +   passing ABI.  XXX: This function is obsolete and is only used for
> +   checking psABI compatibility with previous versions of GCC.  */
> +
>  static bool
> -contains_aligned_value_p (const_tree type)
> +ix86_compat_aligned_value_p (const_tree type)
>  {
>    enum machine_mode mode = TYPE_MODE (type);
>    if (((TARGET_SSE && SSE_REG_MODE_P (mode))
> @@ -6982,7 +6984,7 @@ contains_aligned_value_p (const_tree type)
>  	    for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
>  	      {
>  		if (TREE_CODE (field) == FIELD_DECL
> -		    && contains_aligned_value_p (TREE_TYPE (field)))
> +		    && ix86_compat_aligned_value_p (TREE_TYPE (field)))
>  		  return true;
>  	      }
>  	    break;
> @@ -6990,7 +6992,7 @@ contains_aligned_value_p (const_tree type)
>  
>  	case ARRAY_TYPE:
>  	  /* Just for use if some languages passes arrays by value.  */
> -	  if (contains_aligned_value_p (TREE_TYPE (type)))
> +	  if (ix86_compat_aligned_value_p (TREE_TYPE (type)))
>  	    return true;
>  	  break;
>  
> @@ -7023,7 +7025,7 @@ ix86_old_function_arg_boundary (enum machine_mode mode, const_tree type,
>  	}
>        else
>  	{
> -	  if (!contains_aligned_value_p (type))
> +	  if (!ix86_compat_aligned_value_p (type))
>  	    align = PARM_BOUNDARY;
>  	}
>      }
> @@ -7032,6 +7034,59 @@ ix86_old_function_arg_boundary (enum machine_mode mode, const_tree type,
>    return align;
>  }
>  
> +/* Return true when TYPE should be 128bit aligned for 32bit argument
> +   passing ABI.  */
> +
> +static bool
> +ix86_contains_aligned_value_p (const_tree type)
> +{
> +  enum machine_mode mode = TYPE_MODE (type);
> +
> +  if (mode == XFmode || mode == XCmode)
> +    return false;
> +
> +  if (TYPE_ALIGN (type) < 128)
> +    return false;
> +
> +  if (!AGGREGATE_TYPE_P (type))
> +    return TYPE_ALIGN (type) >= 128;
> +  else
> +    {
> +      /* Walk the aggregates recursively.  */
> +      switch (TREE_CODE (type))
> +	{
> +	case RECORD_TYPE:
> +	case UNION_TYPE:
> +	case QUAL_UNION_TYPE:
> +	  {
> +	    tree field;
> +
> +	    /* Walk all the structure fields.  */
> +	    for (field = TYPE_FIELDS (type);
> +		 field;
> +		 field = DECL_CHAIN (field))
> +	      {
> +		if (TREE_CODE (field) == FIELD_DECL
> +		    && ix86_contains_aligned_value_p (TREE_TYPE (field)))
> +		  return true;
> +	      }
> +	    break;
> +	  }
> +
> +	case ARRAY_TYPE:
> +	  /* Just for use if some languages passes arrays by value.  */
> +	  if (ix86_contains_aligned_value_p (TREE_TYPE (type)))
> +	    return true;
> +	  break;
> +
> +	default:
> +	  gcc_unreachable ();
> +	}
> +    }
> +
> +  return false;
> +}
> +
>  /* Gives the alignment boundary, in bits, of an argument with the
>     specified mode and type.  */
>  
> @@ -7055,8 +7110,20 @@ ix86_function_arg_boundary (enum machine_mode mode, const_tree type)
>        static bool warned;
>        int saved_align = align;
>  
> -      if (!TARGET_64BIT && align < 128)
> -	align = PARM_BOUNDARY;
> +      if (!TARGET_64BIT)
> +	{
> +	  /* i386 ABI defines XFmode arguments to be 4 byte aligned.  */
> +	  if (!type)
> +	    {
> +	      if (mode == XFmode || mode == XCmode)
> +		align = PARM_BOUNDARY;
> +	    }
> +	  else if (!ix86_contains_aligned_value_p (type))
> +	    align = PARM_BOUNDARY;
> +
> +	  if (align < 128)
> +	    align = PARM_BOUNDARY;
> +	}
>  
>        if (warn_psabi
>  	  && !warned



More information about the Gcc-patches mailing list