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.