https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91386
Bug ID: 91386
Summary: open-iscsi iscsiadm miscompiled by LTO on aarch64
Product: gcc
Version: 9.1.1
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: [email protected]
Target Milestone: ---
Target: aarch64-*-*
This is the start of main from iscsiadm:
8fe0: d13003ff sub sp, sp, #0xc00
8fe4: a9007bfd stp x29, x30, [sp]
8fe8: 910003fd mov x29, sp
8fec: a9025bf5 stp x21, x22, [sp, #32]
8ff0: 2a0003f6 mov w22, w0
8ff4: f0000420 adrp x0, 8f000
<iscsi_ifaces_get@plt+0x86030>
8ff8: a90153f3 stp x19, x20, [sp, #16]
8ffc: f9479800 ldr x0, [x0, #3888]
9000: a90363f7 stp x23, x24, [sp, #48]
9004: d10983ff sub sp, sp, #0x260
9008: aa0103f7 mov x23, x1
900c: f9400001 ldr x1, [x0]
9010: f9072fe1 str x1, [sp, #3672]
9014: d2800001 mov x1, #0x0 // #0
9018: b90397ff str wzr, [sp, #916]
901c: b9039bff str wzr, [sp, #920]
9020: f901d7ff str xzr, [sp, #936]
9024: f901dbff str xzr, [sp, #944]
9028: 97fffd12 bl 8470 <iscsi_context_new@plt>
902c: f9017fe0 str x0, [sp, #760]
9030: b4007540 cbz x0, 9ed8 <iscsi_ifaces_get@plt+0xf08>
9034: f90153f9 str x25, [sp, #672]
9038: b0000021 adrp x1, e000 <iscsi_ifaces_get@plt+0x5030>
903c: f90157fa str x26, [sp, #680]
9040: 910d0021 add x1, x1, #0x340
9044: f9015bfb str x27, [sp, #688]
9048: 911263e0 add x0, sp, #0x498
904c: f900011c str x28, [x8]
The last insn is part of the prologue to save register x28, but x8 is never
set.
This breaks during peephole2:
(insn/f:TI 7430 7429 7271 4 (set (mem/c:DI (plus:DI (reg/f:DI 31 sp)
(const_int 696 [0x2b8])) [69 S8 A8])
(reg:DI 28 x28)) 47 {*movdi_aarch64}
(expr_list:REG_DEAD (reg:DI 28 x28)
(expr_list:REG_CFA_OFFSET (set (mem/c:DI (plus:DI (reg/f:DI 31 sp)
(const_int 696 [0x2b8])) [69 S8 A8])
(reg:DI 28 x28))
(nil))))
is transformed into:
(insn/f:TI 7430 7429 7842 4 (set (mem/c:DI (reg:DI 8 x8) [69 S8 A8])
(reg:DI 28 x28)) 47 {*movdi_aarch64}
(expr_list:REG_DEAD (reg:DI 28 x28)
(expr_list:REG_CFA_OFFSET (set (mem/c:DI (plus:DI (reg/f:DI 31 sp)
(const_int 696 [0x2b8])) [69 S8 A8])
(reg:DI 28 x28))
(nil))))