On Mon, Jul 18, 2011 at 10:42 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Mon, Jul 18, 2011 at 1:33 PM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> On Mon, Jul 18, 2011 at 10:25 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>
>>>>>>> TARGET_MEM_REF only works on ptr_mode.   This patch allows 32bit address
>>>>>>> in x32 mode.  OK for trunk?
>>>>>>
>>>>>> Do you perhaps have a testcase to help in analyzing the problem?
>>>>>>
>>>>>
>>>>> See:
>>>>>
>>>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49780
>>>>
>>>> I don't think that tree-ssa-address/addr_for_mem_ref is correct when
>>>> REALLY_EXPAND is false. It constructs RTX "template" in pointer_mode,
>>>> which is not necessary valid and is rejected from
>>>> ix86_validate_address_p. When really expanding the expression, we have
>>>> a conversion at the end:
>>>>
>>>>  gen_addr_rtx (pointer_mode, sym, bse, idx, st, off, &address, NULL, NULL);
>>>>  if (pointer_mode != address_mode)
>>>>    address = convert_memory_address (address_mode, address);
>>>>  return address;
>>>>
>>>> This is in fact your r175912 change in the fix for PR47383 - you need
>>>> to do something with template as well...
>>>>
>>>
>>> Since TARGET_MEM_REF only works on ptr_mode, I don't think
>>> we can change template.  We just need to accept TARGET_MEM_REF
>>> in ptr_mode and fix it up later.
>>
>> No, a template is used to get some insight into the supported address
>> structure. If there is a mismatch, this approach fails, we can as well
>> give the compiler whatever fake template we want.
>>
>
> Like this?  This patch restores the previous behavior when REALLY_EXPAND
> is false.  I can test it if it is OK.
>
> --
> H.J.
> ---
> diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c
> index c6dced1..4e7b0b5 100644
> --- a/gcc/tree-ssa-address.c
> +++ b/gcc/tree-ssa-address.c
> @@ -221,16 +221,16 @@ addr_for_mem_ref (struct mem_address *addr, 
> addr_space_t a
> s,
>       if (!templ->ref)
>        {
>          sym = (addr->symbol ?
> -                gen_rtx_SYMBOL_REF (pointer_mode, ggc_strdup ("test_symbol"))
> +                gen_rtx_SYMBOL_REF (address_mode, ggc_strdup ("test_symbol"))
>                 : NULL_RTX);
>          bse = (addr->base ?
> -                gen_raw_REG (pointer_mode, LAST_VIRTUAL_REGISTER + 1)
> +                gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 1)
>                 : NULL_RTX);
>          idx = (addr->index ?
> -                gen_raw_REG (pointer_mode, LAST_VIRTUAL_REGISTER + 2)
> +                gen_raw_REG (address_mode, LAST_VIRTUAL_REGISTER + 2)
>                 : NULL_RTX);
>
> -         gen_addr_rtx (pointer_mode, sym, bse, idx,
> +         gen_addr_rtx (address_mode, sym, bse, idx,
>                        st? const0_rtx : NULL_RTX,
>                        off? const0_rtx : NULL_RTX,
>                        &templ->ref,

I think the template should instead get a zero_extend as its outermost
part, like we'd generate in code-gen.

Richard.

Reply via email to