Thanks, I think you've found a serious bug!<div><br></div><div>Would you be willing to fix it? Please add a test to unittests/Support/ConstantRangeTest.cpp and then mail llvm-commits with the patch to fix it and add the test.</div>


<div><div><br><div class="gmail_quote">On 20 June 2011 23:09, Xi Wang <span dir="ltr"><<a href="mailto:xi.wang@gmail.com" target="_blank">xi.wang@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


Hi,<br>
<br>
I have a question about ConstantRange::sub(const ConstantRange &Other) at lib/Support/ConstantRange.cpp:524.  The code computes the new bounds as follows.<br>
<br>
 APInt NewLower = getLower() - Other.getLower();<br>
 APInt NewUpper = getUpper() - Other.getUpper() + 1;<br>
<br>
Could someone explain this to me?  I was expecting something like<br>
<br>
 APInt NewLower = getLower() - Other.getUpper() + 1;<br>
 APInt NewUpper = getUpper() - Other.getLower();<br></blockquote><div><br></div><div>These aren't quite right, I think it should be:</div><div><br></div><div>NewLower = Lower - (Upper-1)</div><div>NewUpper = (Upper-1) - Lower + 1</div>


<div><br></div><div>Constant ranges are stored half-open, [lower, upper) which means that the upper value is one past the end of the range. I often think of the formula as newmax = max - min --> newupper - 1 = ((getUpper() - 1) - Other.getLower(). min = lower, while max = upper - 1.</div>


<div><br></div><div>Nick</div></div></div></div>