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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2015-08-20
                 CC|                            |jamborm at gcc dot gnu.org
          Component|c                           |tree-optimization
     Ever confirmed|0                           |1

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
;; Function demo_3 (demo_3, funcdef_no=4, decl_uid=1849, cgraph_uid=4,
symbol_order=4)

Candidate (1904): foo
Candidate (1901): foo
Candidate (1898): foo
Candidate (1870): D.1870
Candidate (1869): D.1869
Candidate (1868): D.1868
! Disqualifying D.1868 - No scalar replacements to be created.
Created a replacement for D.1869 offset: 0, size: 32: SR.30

...
demo_3 ()
{
  int foo;
  int foo;
  int SR.30;
  struct foo foo;
  struct foo foo;
  struct foo foo;
  struct foo D.1870;
  struct foo D.1869;
  struct foo D.1868;

  <bb 2>:
  foo = {};
  D.1868 = foo;
  foo ={v} {CLOBBER};
  foo = D.1868;
  foo_12 = MEM[(struct foo *)&D.1868];
  foo_11 = 1;
  MEM[(struct foo *)&foo] = foo_11;
  D.1869 = foo;
  SR.30_13 = foo_11;
  SR.30_14 = 1;
  MEM[(struct foo *)&D.1869] = SR.30_14;
  foo = D.1869;
  foo_16 = SR.30_14;
  foo_17 = 3;
  MEM[(struct foo *)&foo] = foo_17;
  D.1870 = foo;
  some_unknown_function (D.1870);
  return;

}

so it does _some_ SRA but not all required SRA for some reason.

Starts (IMHO) even with new_foo itself during early opts:

Candidate (1835): foo
! Disqualifying foo - No scalar replacements to be created.
new_foo ()
{
  struct foo foo;

  <bb 2>:
  foo = {};
  <retval> = foo;
  foo ={v} {CLOBBER};
  return <retval>;

}

where for some reason we fail to scalarize foo.  Similar add_flag
which ends up with

add_flag (struct foo foo, int flag)
{
  int foo$flags;
  int _2;
  int _4;

  <bb 2>:
  foo$flags_5 = MEM[(struct foo *)&foo];
  _2 = foo$flags_5;
  _4 = _2 | flag_3(D);
  foo$flags_7 = _4;
  MEM[(struct foo *)&foo] = foo$flags_7;
  <retval> = foo;
  return <retval>;

}

hmm, but here we are returning a parameter - we can't scalarize the parameter
and we can't scalarize the return.  But we still want to avoid storing
into 'foo' and store into retval directly.

;; Function demo_1 (demo_1, funcdef_no=2, decl_uid=1843, cgraph_uid=2,
symbol_order=2)

Candidate (1890): foo
Candidate (1858): D.1858
! Disqualifying D.1858 - No scalar replacements to be created.
! Disqualifying foo - No scalar replacements to be created.
demo_1 ()
{
  struct foo foo;
  struct foo D.1858;

  <bb 2>:
  foo = {};
  D.1858 = foo;
  foo ={v} {CLOBBER};
  some_unknown_function (D.1858);
  return;

so no total scalarization for foo?  Maybe SRA is confused by the CLOBBER?

Reply via email to