On 18.10.20 20:32, Stefan Schulze Frielinghaus wrote:
> In case the vectorized version of strlen is used, then each memory
> access inside the loop is 16-byte aligned. Thus add this kind of
> information so that vector alignment hints can later on be emitted.
>
> Bootstrapped and regtested on IBM Z. Ok for master?
>
> gcc/ChangeLog:
>
> * config/s390/s390.c (s390_expand_vec_strlen): Add alignment
> for memory access inside loop.
Ok. Thanks!
Andreas
> ---
> gcc/config/s390/s390.c | 9 +
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
> index dbb541bbea7..f9b27f96fd7 100644
> --- a/gcc/config/s390/s390.c
> +++ b/gcc/config/s390/s390.c
> @@ -5955,6 +5955,7 @@ s390_expand_vec_strlen (rtx target, rtx string, rtx
> alignment)
>rtx temp;
>rtx len = gen_reg_rtx (QImode);
>rtx cond;
> + rtx mem;
>
>s390_load_address (str_addr_base_reg, XEXP (string, 0));
>emit_move_insn (str_idx_reg, const0_rtx);
> @@ -5996,10 +5997,10 @@ s390_expand_vec_strlen (rtx target, rtx string, rtx
> alignment)
>LABEL_NUSES (loop_start_label) = 1;
>
>/* Load 16 bytes of the string into VR. */
> - emit_move_insn (str_reg,
> - gen_rtx_MEM (V16QImode,
> -gen_rtx_PLUS (Pmode, str_idx_reg,
> - str_addr_base_reg)));
> + mem = gen_rtx_MEM (V16QImode,
> + gen_rtx_PLUS (Pmode, str_idx_reg, str_addr_base_reg));
> + set_mem_align (mem, 128);
> + emit_move_insn (str_reg, mem);
>if (into_loop_label != NULL_RTX)
> {
>emit_label (into_loop_label);
>