<html>
    <head>
      <base href="https://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - Calls to empty variadic functions in comdat no longer optimized out"
   href="https://llvm.org/bugs/show_bug.cgi?id=27796">27796</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Calls to empty variadic functions in comdat no longer optimized out
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>libraries
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Windows NT
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>Interprocedural Optimizations
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>warren_ristow@playstation.sony.com
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvm-bugs@lists.llvm.org
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>With LLVM 3.8, the following test-case (compiled at -O2) optimizes everything
away to simply 'main()' returning 0:

  // ======== test.cpp ======== //
  struct DebugMessage {
    void PrintTraceMessage(const char *fmt, ...) {
  #if defined(DEBUG_TRACE_ENABLED)
      // some code here when debugging is enabled
  #endif
    }
    void PrintTraceNote(const char *note) {
  #if defined(DEBUG_TRACE_ENABLED)
      // some code here when debugging is enabled
  #endif
    }
  };

  int main(int argc, char **argv)
  {
    DebugMessage dbg;
    dbg.PrintTraceMessage("%s: Entered main() with argc = %d\n", argv[0],
argc);
    dbg.PrintTraceNote("Done.\n");
    return 0;
  }
  // ========================== //

But with a modern TOT compiler (e.g., r269832), the call from main() to the
empty method:

  DebugMessage::PrintTraceMessage()

remains (and an empty body of DebugMessage::PrintTraceMessage() is emitted, of
course).  On the other hand, the call to the other empty method:

  DebugMessage:: PrintTraceNote()

is still inlined (and thus the body is not emitted).  It's the variadic aspect
of 'DebugMessage::PrintTraceMessage()' that presumably is why it isn't inlined.

Tracking this down, prior to r265762, the variadic call was also inlined, and
so everything was optimized nicely, but with the change of r265762, the
variadic
routine is no longer inlined.  (As an aside, r265762 also needs the change of
r265767 to be applied, to deal with an LLVM API change.)

r265762 is a change to address the issue of PR26774, which is that for
functions in comdat, some Inter Procedural Optimizations (IPO) cannot be done
safely, and so must be suppressed.  Given the discussion in <a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - Doing certain kinds of IPO over comdat functions is unsound"
   href="show_bug.cgi?id=26774">bug 26774</a>, I'd
expect that this can be worked around by changing the test-case so
DebugMessage::PrintTraceMessage() isn't in comdat (e.g., by moving the
definition outside the class).  I've verified that by doing that, main() is
again optimized to simply returning 0.

In this case, as far as I can see, the suppression of the optimization related
to PR26774 is unneeded.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>