The main time a dominator search in the cache fails to produce an accurate range is when we have a "complicated" join node. ie bb4:    if (a > 200) goto bb5 ; else goto bb9 bb5    if (b > 400) goto bb6 ; else goto bb7 bb6    foo (b) bb7    onward()    goto bb200; bb9:   if (b > 200) goto bb6; else goto bb200 in this case bb6  is a complicated join node by ranger standards. It has 2 incoming edges which carry range information for b:    9->6 has [201, +INF] and    5->6 has[401, +INF] The immediate dominator of bb6 is bb4.  When asking bb6 for a range from its dominator, there is no sign of any outgoing ranges for b, and range_from_dom would simply return VARYING. This patch tweaks range_from_dom()  so that we calculate the range for any block in which either   1) The dominator has an outgoing range    (this was the old behaviour only)   2) The current block sees an outgoing range on an incoming edge. The addition of 2) allows us to capture the above case with minimal cost which gets use very very close to the results from the old style full cache value propagation. Bootstrapped on x86_64-pc-linux-gnu with no regressions.  pushed. Andrew