Maybe we should generate a test case (or unit test) with all of the possible 8-bit ones?<div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jul 11, 2012 at 11:31 AM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@googlemail.com" target="_blank">benny.kra@googlemail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Wed Jul 11 13:31:59 2012<br>
New Revision: 160058<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=160058&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=160058&view=rev</a><br>
Log:<br>
PR13326: Fix a subtle edge case in the udiv -> magic multiply generator.<br>
<br>
This caused 6 of 65k possible 8 bit udivs to be wrong.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Support/APInt.cpp<br>
    llvm/trunk/test/CodeGen/X86/divide-by-constant.ll<br>
<br>
Modified: llvm/trunk/lib/Support/APInt.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APInt.cpp?rev=160058&r1=160057&r2=160058&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APInt.cpp?rev=160058&r1=160057&r2=160058&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Support/APInt.cpp (original)<br>
+++ llvm/trunk/lib/Support/APInt.cpp Wed Jul 11 13:31:59 2012<br>
@@ -1446,7 +1446,7 @@<br>
   APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());<br>
   APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());<br>
<br>
-  nc = allOnes - (-d).urem(d);<br>
+  nc = allOnes - (allOnes - d).urem(d);<br>
   p = d.getBitWidth() - 1;  // initialize p<br>
   q1 = signedMin.udiv(nc);  // initialize q1 = 2p/nc<br>
   r1 = signedMin - q1*nc;   // initialize r1 = rem(2p,nc)<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/divide-by-constant.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/divide-by-constant.ll?rev=160058&r1=160057&r2=160058&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/divide-by-constant.ll?rev=160058&r1=160057&r2=160058&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/divide-by-constant.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/divide-by-constant.ll Wed Jul 11 13:31:59 2012<br>
@@ -71,3 +71,24 @@<br>
 ; CHECK-NOT: shrl<br>
 ; CHECK: ret<br>
 }<br>
+<br>
+; PR13326<br>
+define i8 @test8(i8 %x) nounwind {<br>
+  %div = udiv i8 %x, 78<br>
+  ret i8 %div<br>
+; CHECK: test8:<br>
+; CHECK: shrb %<br>
+; CHECK: imull $211<br>
+; CHECK: shrl $13<br>
+; CHECK: ret<br>
+}<br>
+<br>
+define i8 @test9(i8 %x) nounwind {<br>
+  %div = udiv i8 %x, 116<br>
+  ret i8 %div<br>
+; CHECK: test9:<br>
+; CHECK: shrb $2<br>
+; CHECK: imull $71<br>
+; CHECK: shrl $11<br>
+; CHECK: ret<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>