This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, ivopt] Try aligned offset when get_address_cost


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.



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]