During VRP block walk, global ranges are "finalized" during the walk.  The statement will never be revisited, so the global becomes unchanging. we add inferred ranges when operands of a statement imply further value restrictions.  The most common of these is a de-reference of a pointer implies non-null. These inferred ranges can potentially have transitive effects on values which have already been calculated. Its a form of recalculation, but only effects things after the inferred range. ie:   b.0_1 = b;   _2 = b.0_1 == 0B;  // _2 global range is [0,1]   _3 = (int) _2;       // _3 global range is [0,1]   c = _3;   _5 = *b.0_1;      // b.0_1 is now [1, +INF]   a = _5;   d.3_7 = d;   _8 = _3 % d.3_7;   if (_8 != 0) after the assignment to _5, b.0_1 has a inferred range of non-zero. when we evaluate _8, we only know that _3 is [0,1], therefore _8 is [0,1]  and we cannot fold the following condition. This patch introduces a check before we evaluate the final condition where we check if any inferred ranges introduced in the block affect any of the global values that were calculated.  If they do, the stateemnt is reevalauted using the inferred ranges, and if the result is better, that range is also added as a "transitive" inferred range. In the above case, we register the inferred range for b.0_1:    on-exit update b.0_1 in BB2 : [irange] int * [1, +INF] And then before evaluating the final condition, make a pass thru the block and add the "transitive" inferred ranges: Checking for transitive inferred ranges in BB 2    on-exit update _2 in BB2 : [irange] _Bool [0, 0] NONZERO 0x0    on-exit update _3 in BB2 : [irange] int [0, 0] NONZERO 0x0    on-exit update _8 in BB2 : [irange] int [0, 0] NONZERO 0x0 which then allows us to fold the statement without impacting the global values. Inferred ranges are available to all on-exit calculations, and thus will feed any following blocks. Performance is reasonable, with a less than 1% hit to VRP, and 0.03% overall. Bootstrapped on x86_64-pc-linux-gnu with no regeressions. Pushed. Andrew