[llvm-commits] [llvm] r160058 - in /llvm/trunk: lib/Support/APInt.cpp test/CodeGen/X86/divide-by-constant.ll
Benjamin Kramer
benny.kra at gmail.com
Wed Jul 11 11:54:15 PDT 2012
On 11.07.2012, at 20:39, Chandler Carruth <chandlerc at google.com> wrote:
> Maybe we should generate a test case (or unit test) with all of the possible 8-bit ones?
We have a couple of options here:
- Add a runtime test to the test-suite (which is what I ran locally).
- Add a CodeGen/X86 test for all possible values, trying to avoid dependencies on regalloc as much as possible.
- Add a unit test for APInt. In this case the optimization is driven by CodeGen so some of it has to be replicated.
Any preferences?
- Ben
> On Wed, Jul 11, 2012 at 11:31 AM, Benjamin Kramer <benny.kra at googlemail.com> wrote:
> Author: d0k
> Date: Wed Jul 11 13:31:59 2012
> New Revision: 160058
>
> URL: http://llvm.org/viewvc/llvm-project?rev=160058&view=rev
> Log:
> PR13326: Fix a subtle edge case in the udiv -> magic multiply generator.
>
> This caused 6 of 65k possible 8 bit udivs to be wrong.
>
> Modified:
> llvm/trunk/lib/Support/APInt.cpp
> llvm/trunk/test/CodeGen/X86/divide-by-constant.ll
>
> Modified: llvm/trunk/lib/Support/APInt.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APInt.cpp?rev=160058&r1=160057&r2=160058&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/APInt.cpp (original)
> +++ llvm/trunk/lib/Support/APInt.cpp Wed Jul 11 13:31:59 2012
> @@ -1446,7 +1446,7 @@
> APInt signedMin = APInt::getSignedMinValue(d.getBitWidth());
> APInt signedMax = APInt::getSignedMaxValue(d.getBitWidth());
>
> - nc = allOnes - (-d).urem(d);
> + nc = allOnes - (allOnes - d).urem(d);
> p = d.getBitWidth() - 1; // initialize p
> q1 = signedMin.udiv(nc); // initialize q1 = 2p/nc
> r1 = signedMin - q1*nc; // initialize r1 = rem(2p,nc)
>
> Modified: llvm/trunk/test/CodeGen/X86/divide-by-constant.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/divide-by-constant.ll?rev=160058&r1=160057&r2=160058&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/divide-by-constant.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/divide-by-constant.ll Wed Jul 11 13:31:59 2012
> @@ -71,3 +71,24 @@
> ; CHECK-NOT: shrl
> ; CHECK: ret
> }
> +
> +; PR13326
> +define i8 @test8(i8 %x) nounwind {
> + %div = udiv i8 %x, 78
> + ret i8 %div
> +; CHECK: test8:
> +; CHECK: shrb %
> +; CHECK: imull $211
> +; CHECK: shrl $13
> +; CHECK: ret
> +}
> +
> +define i8 @test9(i8 %x) nounwind {
> + %div = udiv i8 %x, 116
> + ret i8 %div
> +; CHECK: test9:
> +; CHECK: shrb $2
> +; CHECK: imull $71
> +; CHECK: shrl $11
> +; CHECK: ret
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list