[Bug rtl-optimization/43632] [4.5 Regression] -g option became very slow after r157834

jakub at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Tue Apr 6 10:08:00 GMT 2010



------- Comment #5 from jakub at gcc dot gnu dot org  2010-04-06 10:07 -------
callgrind --inclusive=yes says on this:
  438,822,838,411 
/usr/src/gcc/obj/gcc/../../gcc/var-tracking.c:variable_tracking_main
  429,638,024,208 
/usr/src/gcc/obj/libiberty/../../libiberty/hashtab.c:htab_traverse_noresize
[/usr/src/gcc/obj/gcc/cc1plus]
  428,305,658,767 
/usr/src/gcc/obj/libiberty/../../libiberty/hashtab.c:htab_traverse
[/usr/src/gcc/obj/gcc/cc1plus]
  417,506,443,433  ../../gcc/var-tracking.c:vt_find_locations
[/usr/src/gcc/obj/gcc/cc1plus]
  389,486,317,740  ../../gcc/var-tracking.c:dataflow_set_merge
[/usr/src/gcc/obj/gcc/cc1plus]
  389,242,104,098 
/usr/src/gcc/obj/gcc/../../gcc/var-tracking.c:variable_merge_over_cur
  389,242,104,098  ../../gcc/var-tracking.c:variable_merge_over_cur
[/usr/src/gcc/obj/gcc/cc1plus]
  345,572,722,020  ../../gcc/var-tracking.c:intersect_loc_chains
[/usr/src/gcc/obj/gcc/cc1plus]
  292,844,158,243  ../../gcc/var-tracking.c:find_loc_in_1pdv
[/usr/src/gcc/obj/gcc/cc1plus]
  117,800,020,698  /usr/src/gcc/obj/gcc/../../gcc/rtl.c:rtx_equal_p
  117,800,020,698  ../../gcc/rtl.c:rtx_equal_p [/usr/src/gcc/obj/gcc/cc1plus]
   78,786,470,332 
/usr/src/gcc/obj/libiberty/../../libiberty/hashtab.c:htab_find_with_hash
[/usr/src/gcc/obj/gcc/cc1plus]

so, as a micro-optimization what could work is use the spare bits in
location_chain_def (30 bits on 32-bit hosts, 32 + 30 bits on 64-bit hosts) for
something we could compare quickly in place of rtx_equal_p resp. loc_cmp.
Say, having two or 3 topmost bits of those 30 for code (0 for REG, 1 for MEM, 2
for VALUE, 3 for anything else) and for each code encode something in the other
bits (e.g. REGNO for REG, 2 bits REG/MEM/VALUE/other for MEM's address than the
rest of bits, saturating VALUE uid for VALUEs, something else for other codes).
Then we'd call rtx_equal_p or loc_cmp only if two values are equal.

Or better find a way how to do less work during dataflow merges.


-- 


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



More information about the Gcc-bugs mailing list