Hi,<br><br>i am playing the ScalarEvolution these days. i found the the ScalarEvolution will simply return a SCEVUnknow for a ICmpInst, so i think maybe great to add a new kind of SCEV to the ScalarEvolution framework.<br>
<br><br>
for example, if i run  ScalarEvolution on the bc file generate from the 
following C source file:<br>
<br>
int f(int a, int b, int c, int d) {<br>
    return (2 * a + 5 * c + 2) > (4 * d - 3*b +3);<br>
}<br>
<br>
i will get a SCEVUnknow for the compare instruction, but it's great if i could get something like 2 * a + 5 * c - 4 * d - 3*b - 1 > 0 for the compare instruction :)<br><br><br>In my opinion, we need only 3 kind of SCEV expression to express the ICmpInst: SCEVEqCond for equal condition,  SCEVNeCond for not equal condition and SCEVGtCond for others. Because we can always transform A < B to B > A, and transform A >= B to A > B - 1 (or A + 1> B), and A <= B to A < B + 1 (or A - 1 < B). Furthermore, we can transform A > B to A - B > 0 and A != B to A - B != 0, so the SCEV for conditions will be very simple.<br>
<br>As there are already some functions such as "isKnownNonZero" in ScalarEvolution, so we can compute these condition easily. <br><br>With the SCEV for conditions, we may write more meaningful code:<br><br>SCEVEQCond *S = SE.getCondition(some_icmp_instruction);<br>
<br>if (some_cond.isAlwaysTrue(SE))<br>  ... do some thing ...<br>else<br>  ... do some others thing ...<br><br>Dose this make sense? or i just make things unnecessarily complex?<br><br>any comment is appreciated.<br><br>
--best regards<br>ether<br>