[RFC] Handle memset in DSE (take 2)

Richard Sandiford rdsandiford@googlemail.com
Sun Jan 4 22:10:00 GMT 2009


Jakub Jelinek <jakub@redhat.com> writes:
> +  else if (store_mode == BLKmode)
> +    {
> +      /* The store is a memset (addr, const_val, const_size).  */
> +      gcc_assert (CONST_INT_P (store_info->rhs));
> +      store_mode = int_mode_for_mode (read_mode);
> +      if (store_mode == BLKmode)
> +	read_reg = NULL_RTX;
> +      else if (store_info->rhs == const0_rtx)
> +	read_reg = extract_low_bits (read_mode, store_mode, const0_rtx);
> +      else if (GET_MODE_BITSIZE (store_mode) > HOST_BITS_PER_WIDE_INT)
> +	read_reg = NULL_RTX;
> +      else
> +	{
> +	  unsigned HOST_WIDE_INT c
> +	    = INTVAL (store_info->rhs) & (BITS_PER_UNIT - 1);
> +	  int shift = BITS_PER_UNIT;
> +	  while (shift < HOST_BITS_PER_WIDE_INT)
> +	    {
> +	      c |= (c << shift);
> +	      shift <<= 1;
> +	    }
> +	  read_reg = GEN_INT (trunc_int_for_mode (c, store_mode));
> +	  read_reg = extract_low_bits (read_mode, store_mode, read_reg);
> +	}
> +    }

Sorry for the late reply, but I don't think this is a good representation.
I know the modeless nature of CONST_INT has been an ongoing pain, but at
least we could rely on it representing a single infinite-precision constant
integer.  Overloading (const_int x) to mean a sequence of X-valued bytes
seems very confusing IMO.  In other words:

   (set (mem:BLK ...) (const_int 0))

seems reasonable for a memory clear operation, but:

   (set (mem:BLK ...) (const_int 2))

seems a bad choice for something that sets memory to (say)
0x020202020202020202020202020202.

I think we should add a new rtx constant object instead.

Richard



More information about the Gcc-patches mailing list