[PATCH] Fix PR59990

Jakub Jelinek jakub@redhat.com
Thu Jan 30 18:34:00 GMT 2014


On Thu, Jan 30, 2014 at 07:25:03PM +0100, Richard Biener wrote:
> *** 8886,8891 ****
> --- 8892,8932 ----
>   	  || TREE_ADDRESSABLE (desttype))
>   	return NULL_TREE;
>   
> +       /* Make sure we are not copying using a floating-point mode or
> +          a type whose size possibly does not match its precision.  */
> +       if (FLOAT_MODE_P (TYPE_MODE (desttype))
> + 	  || TREE_CODE (desttype) == BOOLEAN_TYPE
> + 	  || TREE_CODE (desttype) == ENUMERAL_TYPE)
> + 	{
> + 	  /* A more suitable int_mode_for_mode would return a vector
> + 	     integer mode for a vector float mode or a integer complex
> + 	     mode for a float complex mode if there isn't a regular
> + 	     integer mode covering the mode of desttype.  */
> + 	  enum machine_mode mode = int_mode_for_mode (TYPE_MODE (desttype));
> + 	  if (mode == BLKmode)
> + 	    desttype = NULL_TREE;
> + 	  else
> + 	    desttype = build_nonstandard_integer_type (GET_MODE_BITSIZE (mode),
> + 						       1);
> + 	}

As I said in the PR, I think you want to do the build_aligned_type
just in case e.g. the floating point type is more aligned than the integer
or vice versa.

> - 	{
> - 	  tree srcitype
> - 	    = lang_hooks.types.type_for_mode (TYPE_MODE (srctype),
> - 					      TYPE_UNSIGNED (srctype));
> - 	  srctype = build_aligned_type (srcitype, TYPE_ALIGN (srctype));
> - 	}
> - 

	Jakub



More information about the Gcc-patches mailing list