IVOPT improvement patch

Zdenek Dvorak rakdver@kam.mff.cuni.cz
Mon Aug 9 08:44:00 GMT 2010


Hi,

> Compiler bootstrapped and tested with Lu's patch (with one minor
> change to initialize off variable) (x86-64/linux) -- also checked dump
> file that offsets are properly computed.

in case that no offsets are allowed (or more hypotetically, if only offsets of
+1 or -1 are allowed), the code below will set min_offset to -2 and max_offset
to +2, thus incorrectly extending the range of allowed offsets.

Zdenek

>        reg1 = gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 1);
>  
> +      width = GET_MODE_BITSIZE (address_mode) - 1;
> +      if (width > (HOST_BITS_PER_WIDE_INT - 1))
> +	width = HOST_BITS_PER_WIDE_INT - 1;
>        addr = gen_rtx_fmt_ee (PLUS, address_mode, reg1, NULL_RTX);
> -      for (i = start; i <= 1 << 20; i <<= 1)
> +
> +      for (i = width; i; i--)
>  	{
> -	  XEXP (addr, 1) = gen_int_mode (i, address_mode);
> -	  if (!memory_address_addr_space_p (mem_mode, addr, as))
> +	  off = -((HOST_WIDE_INT) 1 << i);
> +	  XEXP (addr, 1) = gen_int_mode (off, address_mode);
> +	  if (memory_address_addr_space_p (mem_mode, addr, as))
>  	    break;
>  	}
> -      data->max_offset = i == start ? 0 : i >> 1;
> -      off = data->max_offset;
> +      data->min_offset = off;
>  
> -      for (i = start; i <= 1 << 20; i <<= 1)
> +      for (i = width; i; i--)
>  	{
> -	  XEXP (addr, 1) = gen_int_mode (-i, address_mode);
> -	  if (!memory_address_addr_space_p (mem_mode, addr, as))
> +	  off = ((HOST_WIDE_INT) 1 << i) - 1;
> +	  XEXP (addr, 1) = gen_int_mode (off, address_mode);
> +	  if (memory_address_addr_space_p (mem_mode, addr, as))
>  	    break;
>  	}
> -      data->min_offset = i == start ? 0 : -(i >> 1);
> +      data->max_offset = off;
>  
>        if (dump_file && (dump_flags & TDF_DETAILS))
>  	{
>  	  fprintf (dump_file, "get_address_cost:\n");
> -	  fprintf (dump_file, "  min offset %s %d\n",
> +	  fprintf (dump_file, "  min offset %s " HOST_WIDE_INT_PRINT_DEC "\n",
>  		   GET_MODE_NAME (mem_mode),
> -		   (int) data->min_offset);
> -	  fprintf (dump_file, "  max offset %s %d\n",
> +		   data->min_offset);
> +	  fprintf (dump_file, "  max offset %s " HOST_WIDE_INT_PRINT_DEC "\n",
>  		   GET_MODE_NAME (mem_mode),
> -		   (int) data->max_offset);
> +		   data->max_offset);
>  	}
>  
>        rat = 1;



More information about the Gcc-patches mailing list