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

--- Comment #29 from Andrew Macleod <amacleod at redhat dot com> ---
Huh. Do we calculate *all* paths ahead of time?

I tried running valgrind, which died, but up to that point it showed 77% of the
time spend in the body of 
back_jt_path_registry::adjust_paths_after_duplication ()

That functions looks kind of quadratic or worse in nature, and when I run it
with GDB and force a stop at a random point, I see:

(gdb) p m_paths->m_vec
$2 = (vec<vec<jump_thread_edge*, va_heap, vl_ptr>*, va_heap, vl_embed> *)
0x12f50750
(gdb) p *(m_paths->m_vec)
$3 = {m_vecpfx = {m_alloc = 745039, m_using_auto_storage = 0, m_num = 572595}}
(gdb) p cand_path_num
$4 = 309148
(gdb) p curr_path_num
$5 = 0


Am I reading that right? 572,595 paths, of which we are looking at candidate
#309,148  ??

It *appears* that this is called for path 0, then path 0 is removed and its all
done over again with one less path in the vector.

At one point a little later in back_jt_path_registry::update_cfg I see:

p m_num_threaded_edges
$19 = 18669

and the size of the m_path vector is down to 558637 
(gdb) p *(m_paths.m_vec)
$23 = {m_vecpfx = {m_alloc = 745039, m_using_auto_storage = 0, m_num = 558637}}

back_jt_path_registry::update_cfg() makes a lot of calls to
back_jt_path_registry::duplicate_thread_path which then invokes
adjust_paths_after_duplication

All this time is spend here copying and moving things.

Something seems horribly wrong about that

Reply via email to