This allows GORI to recognize when a relation passed in applies to the 2 operands of the current statement.  Check to see if further range refinement is possible before proceeding. There are 2 primary ways this can happen. 1)  The relation record indicates there is a relation between the LHS and the operand being calculated.  If this is the case, then the relation is passed thru to the range-ops op1_range or op2_range routine for use in evaluating the operand. 2) if there is a relation between op1 and op2, then we take a special step (the new routine refine_using_relation) and look to see if there is also any dependence between op1 and op2.  If there is, we attempt to "refine" their ranges based on this dependence before proceeding further.   For example: d_4 =a_1 * 2 a_1 = b_2 + 1 if (a_1 < b_2) Looking at the true edge, we start with [1,1] = a_1 < b_2 There is a relation between a_1 and b_2, it checks if the value of a_1 is dependent on b_2, and tries to calculate new values for a_1 and b_2 based on this dependence. if op1_range is properly implemented for operator_plus (next patch), then resolving the value of b_2 in a_1 = b_2 + 1  with the relation op1 >= LHS would return the range of [+INF, +INF].  and using that value, a_1 would then have a range of [0, 0]. We calculate and substitute these values early, so that if we are looking for other exported values (such as d_4), the range of a_1 = [0,0] will trickle up to that calculation on the edge, and we'll get d_4 = [0,0] on that edge too. Bootstrapped on x86_64-pc-linux-gnu with no regressions.  Pushed. Andrew