[llvm] r193694 - make ConstantRange::signExtend() optimal

Nick Lewycky nicholas at mxc.ca
Wed Oct 30 23:10:21 PDT 2013


Nuno Lopes wrote:
> Author: nlopes
> Date: Wed Oct 30 10:36:50 2013
> New Revision: 193694
>
> URL: http://llvm.org/viewvc/llvm-project?rev=193694&view=rev
> Log:
> make ConstantRange::signExtend() optimal
> the case [x, INT_MIN) was not handled optimally
>
> Modified:
>      llvm/trunk/lib/Support/ConstantRange.cpp
>      llvm/trunk/unittests/Support/ConstantRangeTest.cpp
>
> Modified: llvm/trunk/lib/Support/ConstantRange.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ConstantRange.cpp?rev=193694&r1=193693&r2=193694&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Support/ConstantRange.cpp (original)
> +++ llvm/trunk/lib/Support/ConstantRange.cpp Wed Oct 30 10:36:50 2013
> @@ -445,6 +445,11 @@ ConstantRange ConstantRange::signExtend(
>
>     unsigned SrcTySize = getBitWidth();
>     assert(SrcTySize<  DstTySize&&  "Not a value extension");
> +
> +  // special case: [X, INT_MIN) -- not really wrapping around
> +  if (Upper == APInt::getHighBitsSet(SrcTySize, 1))

Use "Upper.isMinSignedValue()" (or "Upper.isSignBit()").

Nick

> +    return ConstantRange(Lower.sext(DstTySize), Upper.zext(DstTySize));
> +
>     if (isFullSet() || isSignWrappedSet()) {
>       return ConstantRange(APInt::getHighBitsSet(DstTySize,DstTySize-SrcTySize+1),
>                            APInt::getLowBitsSet(DstTySize, SrcTySize-1) + 1);
>
> Modified: llvm/trunk/unittests/Support/ConstantRangeTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ConstantRangeTest.cpp?rev=193694&r1=193693&r2=193694&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Support/ConstantRangeTest.cpp (original)
> +++ llvm/trunk/unittests/Support/ConstantRangeTest.cpp Wed Oct 30 10:36:50 2013
> @@ -216,6 +216,9 @@ TEST_F(ConstantRangeTest, SExt) {
>
>     EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
>               ConstantRange(APInt(16, -128), APInt(16, 128)));
> +
> +  EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
> +            ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
>   }
>
>   TEST_F(ConstantRangeTest, IntersectWith) {
>
>
> _______________________________________________
> 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