This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, ivopt] Try aligned offset when get_address_cost
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Eric Botcazou <ebotcazou at adacore dot com>,Zhenqiang Chen <zhenqiang dot chen at arm dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 04 Feb 2015 13:47:10 +0100
- Subject: Re: [PATCH, ivopt] Try aligned offset when get_address_cost
- Authentication-results: sourceware.org; auth=none
- References: <000001cfafad$5de00840$19a018c0$ at arm dot com> <3153506 dot iERQeH6ODR at polaris>
On February 4, 2015 11:32:54 AM CET, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> For some TARGET, like ARM THUMB1, the offset in load/store should be
>nature
>> aligned. But in function get_address_cost, when computing max_offset,
>it
>> only tries byte-aligned offsets:
>>
>> ((unsigned HOST_WIDE_INT) 1 << i) - 1
>>
>> which can not meet thumb_legitimate_offset_p check called from
>> thumb1_legitimate_address_p for HImode and SImode.
>>
>> The patch adds additional try for aligned offset:
>>
>> ((unsigned HOST_WIDE_INT) 1 << i) - GET_MODE_SIZE (address_mode).
>
>I think that the change is not fully correct, this must be mem_mode
>instead of
>address_mode since the alignment of the MEM is given by mem_mode:
>
>Index: tree-ssa-loop-ivopts.c
>===================================================================
>--- tree-ssa-loop-ivopts.c (revision 220343)
>+++ tree-ssa-loop-ivopts.c (working copy)
>@@ -3324,12 +3324,12 @@ get_address_cost (bool symbol_present, b
> XEXP (addr, 1) = gen_int_mode (off, address_mode);
> if (memory_address_addr_space_p (mem_mode, addr, as))
> break;
>- /* For some TARGET, like ARM THUMB1, the offset should be
>nature
>- aligned. Try an aligned offset if address_mode is not
>QImode. */
>- off = (address_mode == QImode)
>+ /* For some strict-alignment targets, the offset must be
>naturally
>+ aligned. Try an aligned offset if mem_mode is not QImode.
> */
>+ off = mem_mode == QImode
> ? 0
> : ((unsigned HOST_WIDE_INT) 1 << i)
>- - GET_MODE_SIZE (address_mode);
>+ - GET_MODE_SIZE (mem_mode);
> if (off > 0)
> {
> XEXP (addr, 1) = gen_int_mode (off, address_mode);
>
>
>This fixes unexpected differences in the result of the function between
>SPARC
>and SPARC64 for the same source code. OK for mainline after testing?
OK.
Thanks,
Richard.
>
> * tree-ssa-loop-ivopts.c (get_address_cost): Use proper mode for
>offset.