https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70171

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2016-03-11
          Component|c++                         |tree-optimization
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org
     Ever confirmed|0                           |1

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
This is the C++ frontends work:

;; Function S struct_ternary(S, S, bool) (null)
;; enabled by -tree-original


<<cleanup_point return <retval> = TARGET_EXPR <D.2294, *(const struct S &)
(select ? &a : &b)>>>;

and while we have a pass that cleans this up for scalars it refuses to
operate on aggregates (because it tries to use a PHI in the transform).
Thus phiprop could handle this case emitting non-SSA code here and
do this for aggregates with non-BLKmode.  Basically transform

  <bb 2>:
  if (select_2(D) != 0)
    goto <bb 4>;
  else
    goto <bb 3>;

  <bb 3>:

  <bb 4>:
  # iftmp.1_1 = PHI <&a(2), &b(3)>
  D.2322 = MEM[(const struct S &)iftmp.1_1];

into

  <bb 2>:
  if (select_2(D) != 0)
    goto <bb 5>;
  else
    goto <bb 3>;

  <bb 3>:
    D.2322 = b;
    goto <bb 5>;

  <bb 5>:
    D.2322 = a;

  <bb 4>:


Let me try to tackle this for GCC 7.

Reply via email to