[llvm-bugs] [Bug 27308] New: r210828 (GVN: Enable value forwarding for calloc) can cause absurdly long compile times

via llvm-bugs llvm-bugs at lists.llvm.org
Sat Apr 9 17:48:36 PDT 2016


            Bug ID: 27308
           Summary: r210828 (GVN: Enable value forwarding for calloc) can
                    cause absurdly long compile times
           Product: new-bugs
           Version: trunk
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
          Assignee: unassignedbugs at nondot.org
          Reporter: dimitry at andric.com
                CC: llvm-bugs at lists.llvm.org
    Classification: Unclassified

Created attachment 16199
  --> https://llvm.org/bugs/attachment.cgi?id=16199&action=edit
Test case for r210828 regression in compile time

A recent Mesa update in FreeBSD caused a seemingly hanging instance of clang
for me, when it was compiling a rather large generated .c file (generated by
 After waiting long enough, the hang turned out to be just an extremely slow

This extreme slowdown turned out to be introduced somewhere between clang 3.4
and 3.5, and after bisecting I ended up at http://reviews.llvm.org/rL210828
("GVN: Enable value forwarding for calloc").  Timings of the test case on a
Xeon E5-2630 v3 @ 2.40GHz, with clang r210827:

        7.98 real         7.86 user         0.12 sys

Same test case, with clang r210828:

      215.30 real       207.70 user         7.59 sys

E.g., roughly a factor 27 slowdown!

It appears both targeting i386, -mdisable-fp-elim and -O2 are essential in the
command line for the test case:

clang -cc1 -triple i386 -mdisable-fp-elim -O2 -w glapi-long-compile.c

With regards to the test case itself, the 'meat' is a large generated function
_glapi_create_table_from_handle(), which basically consists of a very large
number of blocks like:

    if(!disp->CallList) {
        void ** procp = (void **) &disp->CallList;
        snprintf(symboln, sizeof(symboln), "%sCallList", symbol_prefix);
        *procp = dlsym(handle, symboln);

Strangely, though r210828 is apparently about calloc, the only calloc is at the
start of that function:

struct _glapi_table *
_glapi_create_table_from_handle(void *handle, const char *symbol_prefix) {
    struct _glapi_table *disp = calloc(_glapi_get_dispatch_table_size(),
    char symboln[512];
        return ((void *)0);

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20160410/2d338d60/attachment.html>

More information about the llvm-bugs mailing list