public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug ipa/94693] New: IPA SRA should elide unused out parameters
@ 2020-04-21 14:28 rguenth at gcc dot gnu.org
  2020-04-21 14:28 ` [Bug ipa/94693] " rguenth at gcc dot gnu.org
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: rguenth at gcc dot gnu.org @ 2020-04-21 14:28 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 94693
           Summary: IPA SRA should elide unused out parameters
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: ipa
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rguenth at gcc dot gnu.org
                CC: marxin at gcc dot gnu.org
  Target Milestone: ---

IPA SRA should elide 'out' in

struct outs { int kind; int i; };

void foo (struct outs *out)
{
  if (out->kind == 0)
    ;
  else
    out->i = out->kind;
}

int main()
{
  struct outs out;
  out.kind = 3;
  foo (&out);
  // 'out' is unused [after the call]
}

IPA SRA transform should then produce

void foo.isra (int kind)
{
  struct outs out_;
  out_.kind = kind;
  struct outs *out = out_;
  if (out->kind == 0)
    ;
  else
    out->i = out->kind;
}

int main()
{
  struct outs out;
  out.kind = 3;
  foo (3);
}

and DCE can then eliminate the dead code.  Note the same can work for
the case where out is not written to at all in main () and thus nothing
needs to be passed to foo (that might be the most common case, like when
passing an alternate output by reference that's not needed).  The testcase
above is a more general case.

If analysis at the call site is flow-sensitive it can check whether any
side-effects to 'out' might be observable to handle

{
   struct outs out;
   if (test)
     {
       out.kind = 3;
       foo (&out);
       // out is dead after the call
     }
   else
     {
       bar (&out);
       printf ("%d", out.i);
     }
}

but probably IPA SRA local analysis isn't that powerful.

Note the advantage is not eliding the out variable at the caller side
but possible dead code removal in the callee which need to compute it
(similar to the now handled unused return value handling).

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-04-21 15:30 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-21 14:28 [Bug ipa/94693] New: IPA SRA should elide unused out parameters rguenth at gcc dot gnu.org
2020-04-21 14:28 ` [Bug ipa/94693] " rguenth at gcc dot gnu.org
2020-04-21 14:29 ` rguenth at gcc dot gnu.org
2020-04-21 14:47 ` rguenth at gcc dot gnu.org
2020-04-21 14:54 ` rguenth at gcc dot gnu.org
2020-04-21 15:30 ` egallager at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).