https://llvm.org/bugs/show_bug.cgi?id=27308

            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: unassignedb...@nondot.org
          Reporter: dimi...@andric.com
                CC: llvm-bugs@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
https://cgit.freedesktop.org/mesa/mesa/tree/src/mapi/glapi/gen/gl_gentable.py).
 After waiting long enough, the hang turned out to be just an extremely slow
compilation.

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(),
sizeof(_glapi_proc));
    char symboln[512];
    if(!disp)
        return ((void *)0);
[...]

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to