https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123652
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2026-02-10
Status|UNCONFIRMED |NEW
Component|target |rtl-optimization
Ever confirmed|0 |1
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Looks like partly RTL optimization / RTL expansion (by-pieces) issue. For <3>
we initially get
1: NOTE_INSN_DELETED
3: NOTE_INSN_BASIC_BLOCK 2
2: NOTE_INSN_FUNCTION_BEG
5: [r93:DI-0x3]=0
6: [r93:DI-0x1]=0
7: r99:DI=0
8: r100:DI=zero_extend([r93:DI-0x3])
9: r101:DI=zero_extend(r100:DI#0)
10: {r102:DI=r99:DI&0xffffffffffff0000;clobber flags:CC;}
11: {r103:DI=r102:DI|r101:DI;clobber flags:CC;}
12: r99:DI=r103:DI
13: r104:DI=zero_extend([r93:DI-0x1])
14: r105:DI=zero_extend(r104:DI#0)
15: {r106:DI=r105:DI<<0x10;clobber flags:CC;}
16: {r107:DI=r99:DI&0xffffffffff00ffff;clobber flags:CC;}
17: {r108:DI=r107:DI|r106:DI;clobber flags:CC;}
18: r99:DI=r108:DI
19: r109:DI=r99:DI
20: r98:SI=r109:DI#0
24: ax:SI=r98:SI
25: use ax:SI
which we eventually optimize. But <7> is
1: NOTE_INSN_DELETED
3: NOTE_INSN_BASIC_BLOCK 2
2: NOTE_INSN_FUNCTION_BEG
5: [r93:DI-0x7]=0
6: [r93:DI-0x4]=0
7: r99:DI=0
8: r100:DI=zero_extend([r93:DI-0x7])
9: r101:DI=zero_extend(r100:DI#0)
10: r103:DI=0xffffffff00000000
11: {r102:DI=r99:DI&r103:DI;clobber flags:CC;}
12: {r104:DI=r102:DI|r101:DI;clobber flags:CC;}
13: r99:DI=r104:DI
14: r105:DI=zero_extend([r93:DI-0x3])
15: r106:DI=zero_extend(r105:DI#0)
16: {r107:DI=r106:DI<<0x20;clobber flags:CC;}
17: r109:DI=0xffff0000ffffffff
18: {r108:DI=r99:DI&r109:DI;clobber flags:CC;}
19: {r110:DI=r108:DI|r107:DI;clobber flags:CC;}
20: r99:DI=r110:DI
21: r111:DI=zero_extend([r93:DI-0x1])
22: r112:DI=zero_extend(r111:DI#0)
23: {r113:DI=r112:DI<<0x30;clobber flags:CC;}
24: r115:DI=0xff00ffffffffffff
25: {r114:DI=r99:DI&r115:DI;clobber flags:CC;}
26: {r116:DI=r114:DI|r113:DI;clobber flags:CC;}
27: r99:DI=r116:DI
28: r117:DI=r99:DI
29: r98:DI=r117:DI
33: ax:DI=r98:DI
34: use ax:DI
which looks too complicated for GCCs little mind. The target has its
play with this as well, of course. Overall the above does look quite
stupid initial code-gen for just
struct array f<7> ()
{
struct array D.19031;
<bb 2> [local count: 1073741824]:
D.19031 = {};
return D.19031;
}
very likely because D.19031 fits in a "register". Still zeroing should
be simpler even for that case.