1,154,400 if (bitmap_bit_p(regs_invalidated_by_call_regset, i) 8,080,800 => bitmap.c:bitmap_bit_p (192400x) 1,021,200 && !bitmap_bit_p (&defs_generated, i) 5,106,000 => bitmap.c:bitmap_bit_p (170200x) 340,400 && (!is_sibling_call . || !bitmap_bit_p (df->exit_block_uses, i) . || refers_to_regno_p (i, i+1, . crtl->return_rtx, NULL))) 2,053,500 df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i 35,279,934 => df-scan.c:df_ref_record (170200x) . NULL, bb, insn_info, DF_REF_REG_DEF, . DF_REF_MAY_CLOBBER | flags); . } After: 1,346,800 if (TEST_HARD_REG_BIT(regs_invalidated_by_call, i) 510,600 && !TEST_HARD_REG_BIT (defs_generated, i) 340,400 && (!is_sibling_call . || !bitmap_bit_p (df->exit_block_uses, i) . || refers_to_regno_p (i, i+1, . crtl->return_rtx, NULL))) 2,057,200 df_ref_record (DF_REF_BASE, collection_rec, regno_reg_rtx[i 35,279,934 => df-scan.c:df_ref_record (170200x) . NULL, bb, insn_info, DF_REF_REG_DEF, . DF_REF_MAY_CLOBBER | flags); . } Dimitris
To document the gains from the bitmaps, here is (part of) the annotated
source from callgrind profiler, showing instruction count. Before:
- [df-scan.c] Optimise DF_REFs ordering in collection_re... Dimitrios Apostolou
- Re: [df-scan.c] Optimise DF_REFs ordering in coll... Dimitrios Apostolou
- Re: [df-scan.c] Optimise DF_REFs ordering in coll... Dimitrios Apostolou
- Re: [df-scan.c] Optimise DF_REFs ordering in ... Paolo Bonzini
- Re: [df-scan.c] Optimise DF_REFs ordering... Dimitrios Apostolou
- Re: [df-scan.c] Optimise DF_REFs ordering in coll... Steven Bosscher
- Re: [df-scan.c] Optimise DF_REFs ordering in ... Dimitrios Apostolou
- Re: [df-scan.c] Optimise DF_REFs ordering in coll... Jakub Jelinek
- Re: [df-scan.c] Optimise DF_REFs ordering in ... Dimitrios Apostolou
- Re: [df-scan.c] Optimise DF_REFs ordering... Paolo Bonzini
- Re: [df-scan.c] Optimise DF_REFs ordering in coll... Richard Guenther
- Re: [df-scan.c] Optimise DF_REFs ordering in ... Dimitrios Apostolou