More missed givs

Jan Hubicka hubicka@atrey.karlin.mff.cuni.cz
Mon Apr 17 14:23:00 GMT 2000


> On Mon, Apr 17, 2000 at 01:40:18PM +0200, Jan Hubicka wrote:
> > 	* loop.c (simplify_giv_expr):  Simplify (invar + const1) * const2
> > 	to invar * const2 + const1 * const2.
> 
> Ok.
Thanks a lot for reviewing, but actually I've made somewhat more invoved
patch for this.  It does more simplifications on mults and generally results
in better strength reduce.

So can you please take a look at this one?

On the byte benchmarks, this adds about 20% to FP EMULATION test

Tue Apr 11 20:58:53 CEST 2000  Jan Hubicka  <jh@suse.cz>
	* loop.c (simplify_giv_expr):  Be more agressive on simplifying
	constant MULT givs.

*** /usr/src/egcs-20000306.orig1/gcc/loop.c	Sun Apr  9 11:41:05 2000
--- loop.c	Tue Apr 11 20:54:26 2000
*************** simplify_giv_expr (loop, x, benefit)
*** 6844,6868 ****
  	  return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
  
  	case USE:
! 	  /* invar * invar.  It is a giv, but very few of these will 
! 	     actually pay off, so limit to simple registers.  */
  	  if (GET_CODE (arg1) != CONST_INT)
  	    return NULL_RTX;
  
  	  arg0 = XEXP (arg0, 0);
! 	  if (GET_CODE (arg0) == REG)
! 	    tem = gen_rtx_MULT (mode, arg0, arg1);
! 	  else if (GET_CODE (arg0) == MULT
! 		   && GET_CODE (XEXP (arg0, 0)) == REG
! 		   && GET_CODE (XEXP (arg0, 1)) == CONST_INT)
! 	    {
! 	      tem = gen_rtx_MULT (mode, XEXP (arg0, 0), 
! 				  GEN_INT (INTVAL (XEXP (arg0, 1))
! 					   * INTVAL (arg1)));
  	    }
! 	  else
! 	    return NULL_RTX;
! 	  return gen_rtx_USE (mode, tem);
  
  	case MULT:
  	  /* (a * invar_1) * invar_2.  Associate.  */
--- 6853,6889 ----
  	  return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
  
  	case USE:
! 	  /* invar * invar is a giv, but attempt to simplify it somehow.  */
  	  if (GET_CODE (arg1) != CONST_INT)
  	    return NULL_RTX;
  
  	  arg0 = XEXP (arg0, 0);
! 	  if (GET_CODE (arg0) == MULT)
! 	    {
! 	      /* (invar_0 * invar_1) * invar_2.  Associate.  */
! 	      return simplify_giv_expr (loop,
! 					gen_rtx_MULT (mode,
! 						      XEXP (arg0, 0),
! 						      gen_rtx_MULT (mode,
! 								    XEXP (arg0,
!									  1),
! 								    arg1)),
! 					benefit);
! 	    }
! 	  /* Porpagate the MULT expressions to the intermost nodes.  */
! 	  else if (GET_CODE (arg0) == PLUS)
! 	    {
! 	      /* (invar_0 + invar_1) * invar_2.  Distribute.  */
! 	      return simplify_giv_expr (loop,
! 					gen_rtx_PLUS (mode,
! 						      gen_rtx_MULT (mode,
! 								    XEXP (arg0,
!								    0),
! 								    arg1),
! 						      gen_rtx_MULT (mode,
! 								    XEXP (arg0,
!								    1),
! 								    arg1)),
! 					benefit);
  	    }
! 	  return gen_rtx_USE (mode, gen_rtx_MULT (mode, arg0, arg1));
  
  	case MULT:
  	  /* (a * invar_1) * invar_2.  Associate.  */


More information about the Gcc-patches mailing list