diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-11 21:52:49 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-11 21:52:49 +0000 |
commit | 21b8bc7e570bc288d4920ae69ea8ff9acc819d5e (patch) | |
tree | e46e95eb2fb00a9a4043e23fc4ae9d095ad324b4 /gcc/emit-rtl.c | |
parent | f48279259be167c1dacd3bf35f2e49ed22125b13 (diff) | |
download | gcc-21b8bc7e570bc288d4920ae69ea8ff9acc819d5e.tar.gz |
PR rtl-optimization/55247
PR middle-end/55259
* emit-rtl.c (adjust_address_1): If POINTERS_EXTEND_UNSIGNED > 0,
handle ZERO_EXTEND.
* recog.c (offsettable_address_addr_space_p): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193415 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r-- | gcc/emit-rtl.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 95bbfa7c8b6..f39d8616069 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -2071,10 +2071,12 @@ adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset, rtx new_rtx; enum machine_mode address_mode; int pbits; - struct mem_attrs attrs, *defattrs; + struct mem_attrs attrs = *get_mem_attrs (memref), *defattrs; unsigned HOST_WIDE_INT max_align; - - attrs = *get_mem_attrs (memref); +#ifdef POINTERS_EXTEND_UNSIGNED + enum machine_mode pointer_mode + = targetm.addr_space.pointer_mode (attrs.addrspace); +#endif /* If there are no changes, just return the original memory reference. */ if (mode == GET_MODE (memref) && !offset @@ -2109,6 +2111,18 @@ adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset, addr = gen_rtx_LO_SUM (address_mode, XEXP (addr, 0), plus_constant (address_mode, XEXP (addr, 1), offset)); +#ifdef POINTERS_EXTEND_UNSIGNED + /* If MEMREF is a ZERO_EXTEND from pointer_mode and the offset is valid + in that mode, we merge it into the ZERO_EXTEND. We take advantage of + the fact that pointers are not allowed to overflow. */ + else if (POINTERS_EXTEND_UNSIGNED > 0 + && GET_CODE (addr) == ZERO_EXTEND + && GET_MODE (XEXP (addr, 0)) == pointer_mode + && trunc_int_for_mode (offset, pointer_mode) == offset) + addr = gen_rtx_ZERO_EXTEND (address_mode, + plus_constant (pointer_mode, + XEXP (addr, 0), offset)); +#endif else addr = plus_constant (address_mode, addr, offset); } |