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