https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114674
Bug ID: 114674 Summary: [aarch64] ldp_fusion fails to merge 2 strs due to imprecise alignment info Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: dizhao at os dot amperecomputing.com Target Milestone: --- For the case below: 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); } When compiled with "-O3 --param=aarch64-stp-policy=aligned", gcc failed to fuse the memory access instructions into stp/ldp, the dump file 312r.ldp_fusion1 says "ldp/stp policy says no". However, the accessing to ts.f1 is aligned to 64 bit: (insn 26 23 33 2 (set (mem/c:SI (lo_sum:DI (reg/f:DI 113) (symbol_ref:DI ("*.LANCHOR0") [flags 0x182])) [1 ts.f1+0 S4 A64]) ... So it looks like the 2 str instructions should be fused with aarch64-stp-policy=aligned. After debugged this a bit, it seems the problem is ldp_bb_info::fuse_pair changed the alignment info when calling adjust_address_nv, to rewrite the base of ts.f1.