diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/aarch64/aarch64-ldp-fusion.cc | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/pr114674.c | 17 |
2 files changed, 21 insertions, 4 deletions
diff --git a/gcc/config/aarch64/aarch64-ldp-fusion.cc b/gcc/config/aarch64/aarch64-ldp-fusion.cc index 0bc225d..437f0ae 100644 --- a/gcc/config/aarch64/aarch64-ldp-fusion.cc +++ b/gcc/config/aarch64/aarch64-ldp-fusion.cc @@ -1722,11 +1722,11 @@ ldp_bb_info::fuse_pair (bool load_p, adjust_amt *= -1; rtx change_reg = XEXP (change_pat, !load_p); - machine_mode mode_for_mem = GET_MODE (change_mem); rtx effective_base = drop_writeback (base_mem); - rtx new_mem = adjust_address_nv (effective_base, - mode_for_mem, - adjust_amt); + rtx adjusted_addr = plus_constant (Pmode, + XEXP (effective_base, 0), + adjust_amt); + rtx new_mem = replace_equiv_address_nv (change_mem, adjusted_addr); rtx new_set = load_p ? gen_rtx_SET (change_reg, new_mem) : gen_rtx_SET (new_mem, change_reg); diff --git a/gcc/testsuite/gcc.target/aarch64/pr114674.c b/gcc/testsuite/gcc.target/aarch64/pr114674.c new file mode 100644 index 0000000..944784f --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr114674.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 --param=aarch64-stp-policy=aligned" } */ +typedef struct { + unsigned int f1; + unsigned int f2; +} test_struct; + +static test_struct ts = { + 123, 456 +}; + +void foo(void) +{ + ts.f2 = 36969 * (ts.f2 & 65535) + (ts.f1 >> 16); + ts.f1 = 18000 * (ts.f2 & 65535) + (ts.f2 >> 16); +} +/* { dg-final { scan-assembler-times "stp" 1 } } */ |