On Tue, Feb 19, 2013 at 02:59:46PM +0100, Richard Biener wrote: > This speeds up IVOPTs by optimizing its hottest function when compiling > polyhedron linpk. The datastructure used for recording use, candidate > costs (a hashtable) should make O(1) queries on average - but it turns > out that for use, candidate queries that have no entry recorded in > it it is O(n) currently. That's because the collision handling does > not abort when coming across an empty hashtable entry (oops). > > Overall compile-time effect is noise (linpk compiles in less than > a second for me ...), but callgrind tells me it results in a 3% > compile-time improvement. > > There is still the degenerate cases when the hashtable is (almost) > full (doesn't happen for this testcase), but that's an unrelated issue. > > Bootstrap and regtest running on x86_64-unknown-linux-gnu. > > Jakub, does this look ok for trunk now or shall I wait for stage1? >
This: > /* Round up to the power of two, so that moduling by it is fast. */ > ! for (size = 1; size < s; size <<= 1) > ! continue; > } > > use->n_map_members = size; isn't equivalent to: > /* Round up to the power of two, so that moduling by it is fast. */ > ! size = 1 << ceil_log2 (s + 1); > } size = s ? (1 << ceil_log2 (s)) : 1; would be I think. Is it intentional that for power of 2 you set now size to double that value? > --- 2725,2737 ---- > for (i = s; i < use->n_map_members; i++) > if (use->cost_map[i].cand == cand) > return use->cost_map + i; > ! else if (use->cost_map[i].cand == NULL) > ! return NULL; > for (i = 0; i < s; i++) > if (use->cost_map[i].cand == cand) > return use->cost_map + i; > + else if (use->cost_map[i].cand == NULL) > + return NULL; > > return NULL; > } This looks good to me, even at this point. Jakub