]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[alpha] adjust MEM alignment for block move [PR115459]
authorAlexandre Oliva <oliva@adacore.com>
Fri, 12 Jul 2024 08:42:07 +0000 (05:42 -0300)
committerAlexandre Oliva <oliva@gnu.org>
Fri, 12 Jul 2024 08:42:07 +0000 (05:42 -0300)
Before issuing loads or stores for a block move, adjust the MEM
alignments if analysis of the addresses enabled the inference of
stricter alignment.  This ensures that the MEMs are sufficiently
aligned for the corresponding insns, which avoids trouble in case of
e.g. substitutions into SUBREGs.

for  gcc/ChangeLog

PR target/115459
* config/alpha/alpha.cc (alpha_expand_block_move): Adjust
MEMs to match inferred alignment.

gcc/config/alpha/alpha.cc

index a6fe95e71778bd28aaea356ea2b93da584f12190..74631a4169351efcf92c2c47e0cad7601f5508bc 100644 (file)
@@ -3820,6 +3820,12 @@ alpha_expand_block_move (rtx operands[])
           else if (a >= 16 && c % 2 == 0)
            src_align = 16;
        }
+
+      if (MEM_P (orig_src) && MEM_ALIGN (orig_src) < src_align)
+       {
+         orig_src = shallow_copy_rtx (orig_src);
+         set_mem_align (orig_src, src_align);
+       }
     }
 
   tmp = XEXP (orig_dst, 0);
@@ -3841,6 +3847,12 @@ alpha_expand_block_move (rtx operands[])
           else if (a >= 16 && c % 2 == 0)
            dst_align = 16;
        }
+
+      if (MEM_P (orig_dst) && MEM_ALIGN (orig_dst) < dst_align)
+       {
+         orig_dst = shallow_copy_rtx (orig_dst);
+         set_mem_align (orig_dst, dst_align);
+       }
     }
 
   ofs = 0;