[PATCH] Partial combiner fix for vector conditions (PR rtl-optimization/87065)

Richard Biener rguenther@suse.de
Mon Aug 27 07:57:00 GMT 2018


On Mon, 27 Aug 2018, Jakub Jelinek wrote:

> Hi!
> 
> This patch is just a partial fix, combine.c has lots of other code that was
> written before vector modes were introduced and won't work well with them.
> 
> The patch also uses ? x : const_true_rtx rather than
> ? CONSTM1_RTX (GET_MODE (x)) : const_true_rtx
> or some new CONST_TRUE_RTX (GET_MODE (x)), so that it is backportable, that
> can be changed on the trunk incrementally.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk and
> release branches?

OK.

Thanks,
Richard.

> 2018-08-27  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR rtl-optimization/87065
> 	* combine.c (simplify_if_then_else): Formatting fix.
> 	(if_then_else_cond): Guard MULT optimization with SCALAR_INT_MODE_P
> 	check.
> 	(known_cond): Don't return const_true_rtx for vector modes.  Use
> 	CONST0_RTX instead of const0_rtx.  Formatting fixes.
> 
> 	* gcc.target/i386/pr87065.c: New test.
> 
> --- gcc/combine.c.jj	2018-08-26 22:42:24.053753908 +0200
> +++ gcc/combine.c	2018-08-27 08:58:26.867124011 +0200
> @@ -6495,7 +6495,7 @@ simplify_if_then_else (rtx x)
>  			  pc_rtx, pc_rtx, 0, 0, 0);
>        if (reg_mentioned_p (from, false_rtx))
>  	false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
> -				   from, false_val),
> +				       from, false_val),
>  			   pc_rtx, pc_rtx, 0, 0, 0);
>  
>        SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
> @@ -9335,6 +9335,7 @@ if_then_else_cond (rtx x, rtx *ptrue, rt
>  
>  	  if (COMPARISON_P (cond0)
>  	      && COMPARISON_P (cond1)
> +	      && SCALAR_INT_MODE_P (mode)
>  	      && ((GET_CODE (cond0) == reversed_comparison_code (cond1, NULL)
>  		   && rtx_equal_p (XEXP (cond0, 0), XEXP (cond1, 0))
>  		   && rtx_equal_p (XEXP (cond0, 1), XEXP (cond1, 1)))
> @@ -9515,12 +9516,12 @@ known_cond (rtx x, enum rtx_code cond, r
>  	  if (COMPARISON_P (x))
>  	    {
>  	      if (comparison_dominates_p (cond, code))
> -		return const_true_rtx;
> +		return VECTOR_MODE_P (GET_MODE (x)) ? x : const_true_rtx;
>  
>  	      code = reversed_comparison_code (x, NULL);
>  	      if (code != UNKNOWN
>  		  && comparison_dominates_p (cond, code))
> -		return const0_rtx;
> +		return CONST0_RTX (GET_MODE (x));
>  	      else
>  		return x;
>  	    }
> @@ -9563,7 +9564,7 @@ known_cond (rtx x, enum rtx_code cond, r
>  	  /* We must simplify subreg here, before we lose track of the
>  	     original inner_mode.  */
>  	  new_rtx = simplify_subreg (GET_MODE (x), r,
> -				 inner_mode, SUBREG_BYTE (x));
> +				     inner_mode, SUBREG_BYTE (x));
>  	  if (new_rtx)
>  	    return new_rtx;
>  	  else
> @@ -9588,7 +9589,7 @@ known_cond (rtx x, enum rtx_code cond, r
>  	  /* We must simplify the zero_extend here, before we lose
>  	     track of the original inner_mode.  */
>  	  new_rtx = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
> -					  r, inner_mode);
> +					      r, inner_mode);
>  	  if (new_rtx)
>  	    return new_rtx;
>  	  else
> --- gcc/testsuite/gcc.target/i386/pr87065.c.jj	2018-08-27 08:46:16.302406144 +0200
> +++ gcc/testsuite/gcc.target/i386/pr87065.c	2018-08-27 08:50:37.179025375 +0200
> @@ -0,0 +1,22 @@
> +/* PR rtl-optimization/87065 */
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -mxop -mprefer-vector-width=128" } */
> +
> +int a, c, d, e;
> +short *b;
> +
> +void
> +foo (void)
> +{
> +  short *g = b;
> +  int h = 1;
> +  unsigned i;
> +  for (; h <= 1; h++)
> +    g = (short *) &c;
> +  for (; c; c++)
> +    {
> +      for (; i <= 1; i++)
> +	;
> +      a ^= (a > 0 <= i) + ((e += d) == 0 ?: (*g = 8));
> +    }
> +}
> 
> 	Jakub
> 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)



More information about the Gcc-patches mailing list