Currently there are a couple places (eliminateCommonSubexpressions and hoistLoopInvariantValues) that both construct a data structure that tracks the set of effects. When we are just tracking heap ranges, then a RangeSet<> will do. But sometimes we want to track that and the other things (control dependence, side exiting, things done to local state, etc). We basically want a version of Effects that tracks the set of effects: so the same boolean fields, but RangeSet<HeapRange> for reads/writes. This would make some code a bit less yucky and a considerably less error-prone. It ought to be perf neutral, too (it just means flipping a handful more booleans).