21dfaaf50e
While debugging a flib test that times out due to bad
compile-time behavior, I fixed several small sources of bad perf
before giving up on trying to just make things fast enough. Most of
these came from profiling while the flib test repeatedly compiled a
tracelet with close to 100k SSATmps (it keeps side-exiting and
recompiling).
Details:
- Waiting until codegen for punting on DefCns made some tracelets
take really long to compile (when they just consist of a bunch of
DefCnses).
- In LinearScan::collectInfo, m_jmps.reset() was the top of the
profiler (since we do it for each exit trace), and from talking
with @swtaarrs it seems like it can be just omitted.
- dce.cpp consumeIncRef was trying to memoize in a way that involved
creating hphp_hash_sets for each SSATmp; removed that. (Someone
should double-check I didn't break the algorithm if possible
because I didn't quite spend the time to 100% understand it.)
- dce creates a new StateVector<SSATmp,SSATmp*> for each exit trace
when sinking. Since the tracelet in question had a side exit for
about 1/3rd of the HHBC ops, this was kinda bad. It's also pretty
sparse, so I just changed it to a smart::flat_map.
- Convert WorkList from std::list to smart::list. (Should maybe be
smart::deque but I didn't want to test fixing the remove() call.)