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

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Ah, the difference is that in the -g0 case, value 3:3946 has 2 locs still at
the true_dependence spot of 1204 vs. 1116 instructions, one (reg/f:DI 7 sp)
like
in the -g case, but also
(plus:DI (value/c:DI 2:2 @0x39559d8/0x39359d0)
    (const_int -384 [0xfffffffffffffe80]))
which is what makes it through the r10-7515 logic map back to 2:2 + optional
offset based address.
In the -g case it is there initially too, but removed in:
#0  unchain_one_elt_loc_list (pl=0x3968820) at ../../gcc/cselib.cc:427
#1  0x00000000006dc6e9 in discard_useless_locs (x=0x39e24b8, info=0x0) at
../../gcc/cselib.cc:675
#2  0x00000000006e5624 in hash_table<cselib_hasher, false,
xcallocator>::traverse_noresize<void*, &(discard_useless_locs(cselib_val**,
void*))> (this=0x38edbc0, argument=0x0)
    at ../../gcc/hash-table.h:1173
#3  0x00000000006e4749 in hash_table<cselib_hasher, false,
xcallocator>::traverse<void*, &(discard_useless_locs(cselib_val**, void*))>
(this=0x38edbc0, argument=0x0)
    at ../../gcc/hash-table.h:1194
#4  0x00000000006dc83f in remove_useless_values () at ../../gcc/cselib.cc:725
#5  0x00000000006e353c in cselib_process_insn (insn=0x7fffea3272c0) at
../../gcc/cselib.cc:3195
#6  0x0000000002617521 in deps_analyze_insn (deps=0x7fffffffd890,
insn=0x7fffea3272c0) at ../../gcc/sched-deps.cc:3801
#7  0x00000000026177b2 in sched_analyze (deps=0x7fffffffd890,
head=0x7fffe9f3e440, tail=0x7fffea31bf30) at ../../gcc/sched-deps.cc:3858
#8  0x000000000261ba36 in schedule_ebb (head=0x7fffe9f3e440,
tail=0x7fffea31bf30, modulo_scheduling=false) at ../../gcc/sched-ebb.cc:505
#9  0x000000000261bf02 in schedule_ebbs () at ../../gcc/sched-ebb.cc:655
when processing insn 1116.
Now, remove_useless_values is guarded:
3189      if (n_useless_values > MAX_USELESS_VALUES
3190          /* remove_useless_values is linear in the hash table size.  Avoid
3191             quadratic behavior for very large hashtables with very few
3192             useless elements.  */
3193          && ((unsigned int)n_useless_values
3194              > (cselib_hash_table->elements () - n_debug_values) / 4))
3195        remove_useless_values ();
On that particular insn 1116, I see:
                                 -g0   -g
n_useless_values                  30   33
cselib_hash_table->elements ()   113  147
n_debug_values                     0   31
#define MAX_USELESS_VALUES 32
147 - 31 is 116, so even that one is 3 larger than in the -g0 case.

Reply via email to