Hi, this fixes PR 91684, where an only 4-byte aligned memory is used with movdi, which is formally invalid for strict alignment, but okay for prefer_ldrd_strd targets.
Boot-strapped and reg-tested on arm-linux-gnueabihf. Patch was approved via BZ. Applied to trunk. Thanks Bernd.
2019-09-06 Bernd Edlinger <bernd.edlin...@hotmail.de> * config/arm/arm.c (arm_block_set_aligned_non_vect): Use gen_unaligned_storedi for 4-byte aligned addresses. testsuite: 2019-09-06 Bernd Edlinger <bernd.edlin...@hotmail.de> * gcc.target/arm/pr91684.c: New test. Index: gcc/config/arm/arm.c =================================================================== --- gcc/config/arm/arm.c (revision 275409) +++ gcc/config/arm/arm.c (working copy) @@ -30352,7 +30352,10 @@ arm_block_set_aligned_non_vect (rtx dstbase, { addr = plus_constant (Pmode, dst, i); mem = adjust_automodify_address (dstbase, DImode, addr, i); - emit_move_insn (mem, reg); + if (MEM_ALIGN (mem) >= 2 * BITS_PER_WORD) + emit_move_insn (mem, reg); + else + emit_insn (gen_unaligned_storedi (mem, reg)); } } else Index: gcc/testsuite/gcc.target/arm/pr91684.c =================================================================== --- gcc/testsuite/gcc.target/arm/pr91684.c (revision 0) +++ gcc/testsuite/gcc.target/arm/pr91684.c (working copy) @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_ldrd_strd_ok } */ +/* { dg-options "-O3" } */ + +typedef struct { int a, b, c; } S; + +void g (S *s); +void bug1 (void) +{ + S s; + __builtin_memset (&s, 0, sizeof (S)); + g (&s); +} + +/* { dg-final { scan-assembler-times "strd" 1 } } */