IBM Z: Emit vector alignment hints for strlen
authorStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Sun, 18 Oct 2020 17:53:49 +0000 (19:53 +0200)
committerStefan Schulze Frielinghaus <stefansf@linux.ibm.com>
Tue, 20 Oct 2020 06:35:15 +0000 (08:35 +0200)
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.

gcc/ChangeLog:

* config/s390/s390.c (s390_expand_vec_strlen): Add alignment
for memory access inside loop.

gcc/config/s390/s390.c

index dbb541bbea71a033468f1a13e59677e19e5da7ab..f9b27f96fd77ab164ff60816eafa3315ee848226 100644 (file)
@@ -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);