[Bug c++/95383] Poor codegen when constructing a trivial Optional

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri May 29 06:21:01 GMT 2020


Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
                 CC|                            |jamborm at gcc dot gnu.org,
                   |                            |rguenth at gcc dot gnu.org
           Keywords|                            |missed-optimization
   Last reconfirmed|                            |2020-05-29
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
I see the cited -O3 code-gen with -O2 on trunk.  We expand from

foo (bool b)
  struct Optional D.2251;
  unsigned char _7;

  <bb 2> [local count: 1073741824]:
  if (b_2(D) != 0)
    goto <bb 3>; [50.00%]
    goto <bb 4>; [50.00%]

  <bb 3> [local count: 536870913]:
  D.2251.D.2152.value = 42;

  <bb 4> [local count: 1073741824]:
  # _7 = PHI <1(3), 0(2)>
  MEM <unsigned char> [(struct Optional *)&D.2251 + 4B] = _7;
  return D.2251;

where the main issue is likely we fail to elide D.2251 because of the
aggregate return (and us not exposing the ABI, etc.).

Note above D.2251 is partly initialized which makes it a bit more difficult
to optimize.  SRA might try to handle these cases by rematerializing the
aggregate just before the return.  We can then hope for RTL expansion
to do "magic".

More information about the Gcc-bugs mailing list