https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109416
Bug ID: 109416 Summary: Missed constant propagation cases after reload Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: sinan.lin at linux dot alibaba.com Target Milestone: --- gcc splits a movdi_32bit pattern into two insns after reload in rv32, which brings constant propagation opportunities. e.g. ``` long long int Data; void init() { Data = 0x0; } void init2() { Data = 0xf00000000; } void init3() { Data = 0xf0000000f; } ``` asm output ``` init: lui a5,%hi(Data) li a3,0 li a4,0 sw a3,%lo(Data)(a5) sw a4,%lo(Data+4)(a5) ret init2: lui a5,%hi(Data) li a2,0 li a3,15 sw a2,%lo(Data)(a5) sw a3,%lo(Data+4)(a5) ret init3: lui a5,%hi(Data) li a2,15 li a3,15 sw a2,%lo(Data)(a5) sw a3,%lo(Data+4)(a5) ret ``` could be optimized into ``` init: lui a5,%hi(Data) sw zero,%lo(Data)(a5) sw zero,%lo(Data+4)(a5) ret init2: lui a5,%hi(Data) li a2,15 sw zero,%lo(Data)(a5) sw a2,%lo(Data+4)(a5) ret init3: lui a5,%hi(Data) li a2,15 sw a2,%lo(Data)(a5) sw a2,%lo(Data+4)(a5) ret ``` A similar case in AArch64 ``` __int128 Data; void init() { Data = 0xfffff; } ``` output ``` init: adrp x0, .LANCHOR0 add x0, x0, :lo12:.LANCHOR0 mov x2, 1048575 mov x3, 0 stp x2, x3, [x0] ret ``` could be optimized into ``` init: adrp x0, .LANCHOR0 add x0, x0, :lo12:.LANCHOR0 mov x2, 1048575 stp x2, xzr, [x0] ret ```