re PR middle-end/89544 (Argument marshalling incorrectly assumes stack slots are naturally aligned.)

2019-08-20  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR middle-end/89544
        * function.c (assign_parm_find_stack_rtl): Use larger alignment
        when possible.

testsuite:
2019-08-20  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR middle-end/89544
        * gcc.target/arm/unaligned-argument-1.c: New test.
        * gcc.target/arm/unaligned-argument-2.c: New test.

From-SVN: r274691
This commit is contained in:
Bernd Edlinger 2019-08-20 05:32:49 +00:00 committed by Bernd Edlinger
parent 876013aa41
commit 1bcec8dfa3
5 changed files with 66 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2019-08-20 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR middle-end/89544
* function.c (assign_parm_find_stack_rtl): Use larger alignment
when possible.
2019-08-19 Joel Hutton <Joel.Hutton@arm.com>
* config/aarch64/aarch64-protos.h (aarch64_fpconst_pow2_recip): New prototype

View file

@ -2697,8 +2697,23 @@ assign_parm_find_stack_rtl (tree parm, struct assign_parm_data_one *data)
intentionally forcing upward padding. Otherwise we have to come
up with a guess at the alignment based on OFFSET_RTX. */
poly_int64 offset;
if (data->locate.where_pad != PAD_DOWNWARD || data->entry_parm)
if (data->locate.where_pad == PAD_NONE || data->entry_parm)
align = boundary;
else if (data->locate.where_pad == PAD_UPWARD)
{
align = boundary;
/* If the argument offset is actually more aligned than the nominal
stack slot boundary, take advantage of that excess alignment.
Don't make any assumptions if STACK_POINTER_OFFSET is in use. */
if (poly_int_rtx_p (offset_rtx, &offset)
&& STACK_POINTER_OFFSET == 0)
{
unsigned int offset_align = known_alignment (offset) * BITS_PER_UNIT;
if (offset_align == 0 || offset_align > STACK_BOUNDARY)
offset_align = STACK_BOUNDARY;
align = MAX (align, offset_align);
}
}
else if (poly_int_rtx_p (offset_rtx, &offset))
{
align = least_bit_hwi (boundary);

View file

@ -1,3 +1,9 @@
2019-08-20 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR middle-end/89544
* gcc.target/arm/unaligned-argument-1.c: New test.
* gcc.target/arm/unaligned-argument-2.c: New test.
2019-08-19 Joel Hutton <Joel.Hutton@arm.com>
* gcc.target/aarch64/fmul_scvtf_1.c: New test.

View file

@ -0,0 +1,19 @@
/* { dg-do compile } */
/* { dg-require-effective-target arm_arm_ok } */
/* { dg-require-effective-target arm_ldrd_strd_ok } */
/* { dg-options "-marm -mno-unaligned-access -O3" } */
struct s {
int a, b;
} __attribute__((aligned(8)));
struct s f0;
void f(int a, int b, int c, int d, struct s f)
{
f0 = f;
}
/* { dg-final { scan-assembler-times "ldrd" 1 } } */
/* { dg-final { scan-assembler-times "strd" 1 } } */
/* { dg-final { scan-assembler-times "stm" 0 } } */

View file

@ -0,0 +1,19 @@
/* { dg-do compile } */
/* { dg-require-effective-target arm_arm_ok } */
/* { dg-require-effective-target arm_ldrd_strd_ok } */
/* { dg-options "-marm -mno-unaligned-access -O3" } */
struct s {
int a, b;
} __attribute__((aligned(8)));
struct s f0;
void f(int a, int b, int c, int d, int e, struct s f)
{
f0 = f;
}
/* { dg-final { scan-assembler-times "ldrd" 0 } } */
/* { dg-final { scan-assembler-times "strd" 0 } } */
/* { dg-final { scan-assembler-times "stm" 1 } } */