http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53880

--- Comment #3 from Markus Trippelsdorf <markus at trippelsdorf dot de> 
2012-07-08 07:08:13 UTC ---
Unfortunately jimis' patch from Bug 53525 doesn't help much:

c++ -c -o pch.hpp.gch /usr/include/boost/math/special_functions.hpp  156.69s
user 0.33s system 99% cpu 2:37.50 total

From "perf top":

 99.78%  cc1plus       [.] gt_pch_p_9line_maps
  0.04%  cc1plus       [.] htab_find_with_hash
  0.02%  cc1plus       [.] gt_pch_p_14lang_tree_node
  0.02%  libc-2.16.so  [.] fwrite_unlocked   ▒
  0.01%  libc-2.16.so  [.] __mempcpy
  0.01%  [kernel]      [k] do_timer 

Zoom into gt_pch_p_9line_maps:

       │         size_t l3 = (size_t)(((*x).info_macro).used);
       │         if ((*x).info_macro.maps != NULL) {
       │           size_t i3;
       │           for (i3 = 0; i3 != (size_t)(l3); i3++) {
  3.89 │109:   cmp    %rcx,%rbx
  3.69 │       nop
  3.15 │     ↓ je     188
  3.11 │112:   mov    0x18(%rbp),%rax
  3.04 │       add    $0x1,%rbx
       │           break;
       │         }
       │     }
       │
       │     void
       │     gt_pch_p_9line_maps (ATTRIBUTE_UNUSED void *this_obj,
  2.76 │11a:   lea    (%rbx,%rbx,4),%r15
  3.53 │       shl    $0x3,%r15
       │       {
       │         size_t l3 = (size_t)(((*x).info_macro).used);
       │         if ((*x).info_macro.maps != NULL) {
       │           size_t i3;
       │           for (i3 = 0; i3 != (size_t)(l3); i3++) {
       │             switch (((*x).info_macro.maps[i3]).reason ==
LC_ENTER_MACRO)
  3.46 │       lea    (%rax,%r15,1),%rdi
  3.42 │       cmpb   $0x4,0x4(%rdi)
  4.40 │     ↑ jne    100
       │               case 1:
       │                 {
       │                   size_t l4 = (size_t)(2 *
((*x).info_macro.maps[i3].d.macro).n_tokens);
       │                   {
       │                     union tree_node * x5 =
       │                       ((*x).info_macro.maps[i3].d.macro.macro) ?
HT_IDENT_TO_GCC_IDENT (HT_NODE (((*x).info_macro.maps[i3].d.macro.macro)))
  4.38 │       mov    0x8(%rdi),%rsi
  4.25 │       xor    %edx,%edx
  2.22 │       lea    -0x18(%rsi),%r8
  2.16 │       test   %rsi,%rsi
  2.68 │       cmovne %r8,%rdx
       │                     if ((void *)((*x).info_macro.maps) == this_obj)
  2.72 │       cmp    %rax,%r14
       │                 break;
       │               case 1:
       │                 {
       │                   size_t l4 = (size_t)(2 *
((*x).info_macro.maps[i3].d.macro).n_tokens);
       │                   {
       │                     union tree_node * x5 =
  2.62 │       mov    %rdx,0x18(%rsp)
       │                       ((*x).info_macro.maps[i3].d.macro.macro) ?
HT_IDENT_TO_GCC_IDENT (HT_NODE (((*x).info_macro.maps[i3].d.macro.macro)))
       │                     if ((void *)((*x).info_macro.maps) == this_obj)
  2.68 │     ↓ je     1a0
       │                       op (&(x5), cookie);
       │                     (*x).info_macro.maps[i3].d.macro.macro = (x5) ?
CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT ((x5))) : NULL;
  2.68 │147:   lea    0x18(%rdx),%rsi
  2.85 │       xor    %eax,%eax
  3.39 │       test   %rdx,%rdx
  3.11 │       cmovne %rsi,%rax
  3.23 │       mov    %rax,0x8(%rdi)
       │                   }
       │                   if ((*x).info_macro.maps[i3].d.macro.macro_locations
!= NULL) {
  5.10 │       mov    0x18(%rbp),%rax
  4.93 │       add    %rax,%r15
  5.48 │       cmpq   $0x0,0x18(%r15)
  3.57 │     ↑ je     109
       │                     size_t i4;
       │                     for (i4 = 0; i4 != (size_t)(l4); i4++) {
       │                     }
       │                     if ((void *)((*x).info_macro.maps) == this_obj)
  3.20 │       cmp    %rax,%r14
  2.82 │     ↑ jne    109
       │                       op
(&((*x).info_macro.maps[i3].d.macro.macro_locations), cookie);
       │       mov    %rcx,0x8(%rsp)
       │       lea    0x18(%r15),%rdi
       │       mov    %r13,%rsi
       │     → callq  *%r12
       │       mov    0x8(%rsp),%rcx
       │       }

Reply via email to