On Mon, Jul 18, 2011 at 1:33 PM, Uros Bizjak <[email protected]> wrote:
> On Mon, Jul 18, 2011 at 10:25 PM, H.J. Lu <[email protected]> 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,