[PATCH] Fix multiply-add regressions after expand-from-SSA

Richard Guenther rguenther@suse.de
Thu Apr 30 08:50:00 GMT 2009


On Thu, 30 Apr 2009, Adam Nemet wrote:

> This fixes the MIPS madd* and msub* regressions from:
> 
>   http://gcc.gnu.org/ml/gcc-testresults/2009-04/msg03063.html
> 
> We now need to look at the TERed expressions for the operands to find the
> underlying multiplications and casts.
> 
> OK if regtest/bootstrap passes on mips64octeon-linux?

I think we should start to _not_ re-build trees here, but instead of

> -       && TREE_CODE (TREE_OPERAND (exp, 0)) == MULT_EXPR)
> +       && (subexp0 = substitute_ter_expr (TREE_OPERAND (exp, 0)))
> +       && TREE_CODE (subexp0) == MULT_EXPR)

do
          && TREE_CODE (TREE_OPERAND (exp, 0)) == SSA_NAME
          && is_gimple_assign (SSA_NAME_DEF_STMT (TREE_OPERAND (exp, 0)))
          && gimple_assign_rhs_code (SSA_NAME_DEF_STMT (TREE_OPERAND (exp, 
0)) == MULT_EXPR)

etc.

For this reason I dislike the substitute_ter_expr helper.  I'll
defer to Matz for suggesting a correct helper (it needs to check
we _can_ TER at least -- but some of these checks may also make
sense if we can re-materialize the expression locally even if they
are not singly used).

Is there a particular reason why combine doesn't catch whatever
the expander does here (I didn't look too closely yet).

Thanks,
Richard.

> Adam
> 
> 
> 	* expr.c (substitute_ter_expr): New function.
> 	(expand_expr_real_1) <PLUS_EXPR, MINUS_EXPR>: Use it when looking
> 	at operands.
> 
> Index: expr.c
> ===================================================================
> --- expr.c	(revision 146915)
> +++ expr.c	(working copy)
> @@ -6992,6 +6992,23 @@ expand_constructor (tree exp, rtx target
>    return target;
>  }
>  
> +/* If EXP is an SSA_NAME and has a TER expression return that.
> +   Otherwise return EXP.  */
> +
> +static tree
> +substitute_ter_expr (tree exp)
> +{
> +  gimple g;
> +
> +  if (TREE_CODE (exp) != SSA_NAME)
> +    return exp;
> +  g = get_gimple_for_ssa_name (exp);
> +  if (!g)
> +    return exp;
> +
> +  return gimple_assign_rhs_to_tree (g);
> +}
> +
>  
>  /* expand_expr: generate code for computing expression EXP.
>     An rtx for the computed value is returned.  The value is never null.
> @@ -8322,14 +8339,14 @@ expand_expr_real_1 (tree exp, rtx target
>        /* Check if this is a case for multiplication and addition.  */
>        if ((TREE_CODE (type) == INTEGER_TYPE
>  	   || TREE_CODE (type) == FIXED_POINT_TYPE)
> -	  && TREE_CODE (TREE_OPERAND (exp, 0)) == MULT_EXPR)
> +	  && (subexp0 = substitute_ter_expr (TREE_OPERAND (exp, 0)))
> +	  && TREE_CODE (subexp0) == MULT_EXPR)
>  	{
>  	  tree subsubexp0, subsubexp1;
>  	  enum tree_code code0, code1, this_code;
>  
> -	  subexp0 = TREE_OPERAND (exp, 0);
> -	  subsubexp0 = TREE_OPERAND (subexp0, 0);
> -	  subsubexp1 = TREE_OPERAND (subexp0, 1);
> +	  subsubexp0 = substitute_ter_expr (TREE_OPERAND (subexp0, 0));
> +	  subsubexp1 = substitute_ter_expr (TREE_OPERAND (subexp0, 1));
>  	  code0 = TREE_CODE (subsubexp0);
>  	  code1 = TREE_CODE (subsubexp1);
>  	  this_code = TREE_CODE (type) == INTEGER_TYPE ? NOP_EXPR
> @@ -8485,14 +8502,14 @@ expand_expr_real_1 (tree exp, rtx target
>        /* Check if this is a case for multiplication and subtraction.  */
>        if ((TREE_CODE (type) == INTEGER_TYPE
>  	   || TREE_CODE (type) == FIXED_POINT_TYPE)
> -	  && TREE_CODE (TREE_OPERAND (exp, 1)) == MULT_EXPR)
> +	  && (subexp1 = substitute_ter_expr (TREE_OPERAND (exp, 1)))
> +	  && TREE_CODE (subexp1) == MULT_EXPR)
>  	{
>  	  tree subsubexp0, subsubexp1;
>  	  enum tree_code code0, code1, this_code;
>  
> -	  subexp1 = TREE_OPERAND (exp, 1);
> -	  subsubexp0 = TREE_OPERAND (subexp1, 0);
> -	  subsubexp1 = TREE_OPERAND (subexp1, 1);
> +	  subsubexp0 = substitute_ter_expr (TREE_OPERAND (subexp1, 0));
> +	  subsubexp1 = substitute_ter_expr (TREE_OPERAND (subexp1, 1));
>  	  code0 = TREE_CODE (subsubexp0);
>  	  code1 = TREE_CODE (subsubexp1);
>  	  this_code = TREE_CODE (type) == INTEGER_TYPE ? NOP_EXPR
> 
> 

-- 
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex



More information about the Gcc-patches mailing list