On Thu, 24 Nov 2016, Senthil Kumar Selvaraj wrote:

> Hi,
> 
>   I've been analyzing a failing regtest (gcc.dg/strlenopt-8.c) for the avr
>   target. I found that the (dump) failure is because there are 4
>   instances of memcpy, while the testcase expects only 2 for a
>   non-strict align target like the avr.
> 
>   Comparing that with a dump generated by x64_64-pc-linux, I found that
>   the extra memcpy's come from the forwprop pass, when it replaces
>   strcat with strlen and memcpy. For x86_64, the memcpy generated gets
>   folded into a load/store in gimple_fold_builtin_memory_op. That
>   doesn't happen for the avr because len (2) happens to be bigger than
>   MOVE_MAX (1).
> 
>   The avr can only move 1 byte efficiently from reg <-> memory, but it's
>   more efficient to load and store 2 bytes than to call memcpy, so
>   MOVE_MAX_PIECES is set to 2.
> 
>   Given that gimple_fold_builtin_memory_op gets to choose between
>   leaving the memcpy call as is, or breaking it down to a by-pieces
>   move, shouldn't it use MOVE_MAX_PIECES instead of
>   MOV_MAX?
> 
>   That is what the below patch does, and that makes the test
>   pass. Does this sound right?

No, as we handle both memcpy and memmove this way we rely on
the whole storage fit in a single register so we do the
right thing for overlapping memory.

Richard.

> Regards
> Senthil
> 
> Index: gcc/gimple-fold.c
> ===================================================================
> --- gcc/gimple-fold.c (revision 242741)
> +++ gcc/gimple-fold.c (working copy)
> @@ -703,7 +703,7 @@
>        src_align = get_pointer_alignment (src);
>        dest_align = get_pointer_alignment (dest);
>        if (tree_fits_uhwi_p (len)
> -       && compare_tree_int (len, MOVE_MAX) <= 0
> +       && compare_tree_int (len, MOVE_MAX_PIECES) <= 0
>         /* ???  Don't transform copies from strings with known length this
>            confuses the tree-ssa-strlen.c.  This doesn't handle
>            the case in gcc.dg/strlenopt-8.c which is XFAILed for that
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to