RFC: Two possible fixes for g++.dg/torture/pr32950.C failure

Martin Jambor mjambor@suse.cz
Sun Jun 14 05:59:00 GMT 2009


Hi,

On Fri, Jun 12, 2009 at 03:45:24PM -0700, Steve Ellcey wrote:
> In investigating PR middle-end/32950 and the failure of 
> g++.dg/torture/pr32950.C.  I found one simple fix and one slightly
> larger fix that we might want to consider as a cleanup change.
> 
> I would like to find out if I should investigate the second fix or not.
> 
> The problem that we are running into is that we come into
> expand_assignment with two variables each of which is a structure
> containing a single variable of type double complex.  Because of the
> optimization done by compute_record_mode, the mode for these types is
> DCmode, not BLKmode.  But the tree type is not COMPLEX, it is a STRUCT
> containing a single field of type COMPLEX.  Now the simple fix for this
> is to modify expand_assignment with a change to look at modes instead
> of types when checking for complex assignment:
> 
> 
> Index: expr.c
> ===================================================================
> --- expr.c	(revision 148407)
> +++ expr.c	(working copy)
> @@ -4250,7 +4250,7 @@ expand_assignment (tree to, tree from, b
>        /* Handle expand_expr of a complex value returning a CONCAT.  */
>        if (GET_CODE (to_rtx) == CONCAT)
>  	{
> -	  if (TREE_CODE (TREE_TYPE (from)) == COMPLEX_TYPE)
> +	  if (COMPLEX_MODE_P (DECL_MODE (from)))
>  	    {
>  	      gcc_assert (bitpos == 0);
>  	      result = store_expr (from, to_rtx, false, nontemporal);
> 
> By checking the mode instead of the tree type we fix the ICE that we
> are running into and everything works.  (I am currently testing this
> patch for regressions).
> 
> But I am wondering about the optmization done in by compute_record_mode
> which causes this situation, this function changes the mode of a
> structure from BLKmode to the mode of its field when a structure only
> has 1 field (with some exceptions).
> 
> It seems like tree-sra should be handling this now and that it might be
> time to get rid of this ad-hoc optimization done during expansion.
> 

Note that SRA can be switched off by the user (-fno-tree-sra) and does
not run by default at -O0.  Moreover, we have already had a discussion
whether SRA should do this  unconditionally and so far we were heading
towards "no" (though  Andrew Pinski said he had  some examples showing
we should).

Martin



More information about the Gcc-patches mailing list