PING: PATCH [9/n]: Prepare x32: PR middle-end/47383: ivopts miscompiles Pmode != ptr_mode
H.J. Lu
hjl.tools@gmail.com
Tue Jul 5 14:27:00 GMT 2011
On Tue, Jul 5, 2011 at 7:15 AM, Richard Guenther
<richard.guenther@gmail.com> wrote:
> On Tue, Jul 5, 2011 at 4:07 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> Ping.
>
> That doesn't look correct without also ensuring we never create a
> TARGET_MEM_REF with a base that is not in the default address-space.
> In fact, with this patch the address-space argument to addr_for_mem_ref
> should go away or we need a hook that provides a non-promoted mode
> for address-spaces.
>
> Uli?
>
> HJ? What testcase does this fix? Please add it at least.
There are many failures in gcc and glibc builds/tests. But
they only show up on x32 target. There is a simple one at
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47383
> That said, this patch seems to paper over a problem that exists elsewhere.
This patch tries to deal with MEM_REF which only works in ptr_mode.
> Richard.
>
>>
>> On Sat, Jun 25, 2011 at 9:20 AM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>>> Hi,
>>>
>>> I was informed that MEM_REF only works in ptr_mode. This patch changes
>>> addr_for_mem_ref to use ptr_mode. OK for trunk?
>>>
>>> Thanks.
>>>
>>>
>>> H.J.
>>> ---
>>> 2011-06-25 H.J. Lu <hongjiu.lu@intel.com>
>>>
>>> PR middle-end/47383
>>> * tree-ssa-address.c (addr_for_mem_ref): Use ptr_mode instead
>>> of targetm.addr_space.address_mode.
>>>
>>> diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c
>>> index e3934e1..ddc6d58 100644
>>> --- a/gcc/tree-ssa-address.c
>>> +++ b/gcc/tree-ssa-address.c
>>> @@ -188,12 +188,12 @@ rtx
>>> addr_for_mem_ref (struct mem_address *addr, addr_space_t as,
>>> bool really_expand)
>>> {
>>> - enum machine_mode address_mode = targetm.addr_space.address_mode (as);
>>> rtx address, sym, bse, idx, st, off;
>>> struct mem_addr_template *templ;
>>>
>>> if (addr->step && !integer_onep (addr->step))
>>> - st = immed_double_int_const (tree_to_double_int (addr->step), address_mode);
>>> + st = immed_double_int_const (tree_to_double_int (addr->step),
>>> + ptr_mode);
>>> else
>>> st = NULL_RTX;
>>>
>>> @@ -201,7 +201,7 @@ addr_for_mem_ref (struct mem_address *addr, addr_space_t as,
>>> off = immed_double_int_const
>>> (double_int_sext (tree_to_double_int (addr->offset),
>>> TYPE_PRECISION (TREE_TYPE (addr->offset))),
>>> - address_mode);
>>> + ptr_mode);
>>> else
>>> off = NULL_RTX;
>>>
>>> @@ -220,16 +220,16 @@ addr_for_mem_ref (struct mem_address *addr, addr_space_t as,
>>> if (!templ->ref)
>>> {
>>> sym = (addr->symbol ?
>>> - gen_rtx_SYMBOL_REF (address_mode, ggc_strdup ("test_symbol"))
>>> + gen_rtx_SYMBOL_REF (ptr_mode, ggc_strdup ("test_symbol"))
>>> : NULL_RTX);
>>> bse = (addr->base ?
>>> - gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 1)
>>> + gen_raw_REG (ptr_mode, LAST_VIRTUAL_REGISTER + 1)
>>> : NULL_RTX);
>>> idx = (addr->index ?
>>> - gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 2)
>>> + gen_raw_REG (ptr_mode, LAST_VIRTUAL_REGISTER + 2)
>>> : NULL_RTX);
>>>
>>> - gen_addr_rtx (address_mode, sym, bse, idx,
>>> + gen_addr_rtx (ptr_mode, sym, bse, idx,
>>> st? const0_rtx : NULL_RTX,
>>> off? const0_rtx : NULL_RTX,
>>> &templ->ref,
>>> @@ -247,16 +247,16 @@ addr_for_mem_ref (struct mem_address *addr, addr_space_t as,
>>>
>>> /* Otherwise really expand the expressions. */
>>> sym = (addr->symbol
>>> - ? expand_expr (addr->symbol, NULL_RTX, address_mode, EXPAND_NORMAL)
>>> + ? expand_expr (addr->symbol, NULL_RTX, ptr_mode, EXPAND_NORMAL)
>>> : NULL_RTX);
>>> bse = (addr->base
>>> - ? expand_expr (addr->base, NULL_RTX, address_mode, EXPAND_NORMAL)
>>> + ? expand_expr (addr->base, NULL_RTX, ptr_mode, EXPAND_NORMAL)
>>> : NULL_RTX);
>>> idx = (addr->index
>>> - ? expand_expr (addr->index, NULL_RTX, address_mode, EXPAND_NORMAL)
>>> + ? expand_expr (addr->index, NULL_RTX, ptr_mode, EXPAND_NORMAL)
>>> : NULL_RTX);
>>>
>>> - gen_addr_rtx (address_mode, sym, bse, idx, st, off, &address, NULL, NULL);
>>> + gen_addr_rtx (ptr_mode, sym, bse, idx, st, off, &address, NULL, NULL);
>>> return address;
>>> }
>>>
>>>
>>
>>
>>
>> --
>> H.J.
>>
>
More information about the Gcc-patches
mailing list