[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