IVOPT improvement patch
Xinliang David Li
davidxl@google.com
Mon Aug 9 23:07:00 GMT 2010
You are right. The attached is the revised version. Ok this time
(after testing is done)?
Thanks,
David
On Mon, Aug 9, 2010 at 12:55 AM, Zdenek Dvorak <rakdver@kam.mff.cuni.cz> wrote:
> 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;
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: address_offset3.p
Type: text/x-pascal
Size: 2431 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20100809/8b67a368/attachment.bin>
More information about the Gcc-patches
mailing list