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.

Reply via email to