[llvm] r296352 - [X86] Use APInt instead of SmallBitVector for tracking undef elements in constant pool shuffle decoding

Ahmed Bougacha via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 1 14:42:18 PST 2017


This seems really unfortunate..  It's very minor, but I found APInt
very unexpected in this context.  Could we fix SmallBitVector to
actually be a "Small" template?  Or honestly maybe just use
SmallVector.

-Ahmed


On Mon, Feb 27, 2017 at 8:15 AM, Craig Topper via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: ctopper
> Date: Mon Feb 27 10:15:25 2017
> New Revision: 296352
>
> URL: http://llvm.org/viewvc/llvm-project?rev=296352&view=rev
> Log:
> [X86] Use APInt instead of SmallBitVector for tracking undef elements in constant pool shuffle decoding
>
> Summary:
> SmallBitVector uses a malloc for more than 58 bits on a 64-bit target and more than 27 bits on a 32-bit target. Some of the vector types we deal with here use more than those number of elements and therefore cause a malloc.
>
> APInt on the other hand supports up to 64 bits without a malloc. That's the maximum number of bits we need here so we can avoid a malloc for all cases by using APInt. This will incur a minor increase in stack usage due to APInt storing the bit count separately from the data bits unlike SmallBitVector, but that should be ok.
>
> Reviewers: RKSimon
>
> Reviewed By: RKSimon
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D30386
>
> Modified:
>     llvm/trunk/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp
>
> Modified: llvm/trunk/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp?rev=296352&r1=296351&r2=296352&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp Mon Feb 27 10:15:25 2017
> @@ -14,7 +14,7 @@
>
>  #include "X86ShuffleDecodeConstantPool.h"
>  #include "Utils/X86ShuffleDecode.h"
> -#include "llvm/ADT/SmallBitVector.h"
> +#include "llvm/ADT/APInt.h"
>  #include "llvm/CodeGen/MachineValueType.h"
>  #include "llvm/IR/Constants.h"
>
> @@ -25,7 +25,7 @@
>  namespace llvm {
>
>  static bool extractConstantMask(const Constant *C, unsigned MaskEltSizeInBits,
> -                                SmallBitVector &UndefElts,
> +                                APInt &UndefElts,
>                                  SmallVectorImpl<uint64_t> &RawMask) {
>    // It is not an error for shuffle masks to not be a vector of
>    // MaskEltSizeInBits because the constant pool uniques constants by their
> @@ -73,7 +73,7 @@ static bool extractConstantMask(const Co
>           "Unaligned shuffle mask size");
>
>    unsigned NumMaskElts = CstSizeInBits / MaskEltSizeInBits;
> -  UndefElts = SmallBitVector(NumMaskElts, false);
> +  UndefElts = APInt(NumMaskElts, 0);
>    RawMask.resize(NumMaskElts, 0);
>
>    for (unsigned i = 0; i != NumMaskElts; ++i) {
> @@ -83,7 +83,7 @@ static bool extractConstantMask(const Co
>      // Only treat the element as UNDEF if all bits are UNDEF, otherwise
>      // treat it as zero.
>      if (EltUndef.isAllOnesValue()) {
> -      UndefElts[i] = true;
> +      UndefElts.setBit(i);
>        RawMask[i] = 0;
>        continue;
>      }
> @@ -103,7 +103,7 @@ void DecodePSHUFBMask(const Constant *C,
>           "Unexpected vector size.");
>
>    // The shuffle mask requires a byte vector.
> -  SmallBitVector UndefElts;
> +  APInt UndefElts;
>    SmallVector<uint64_t, 32> RawMask;
>    if (!extractConstantMask(C, 8, UndefElts, RawMask))
>      return;
> @@ -144,7 +144,7 @@ void DecodeVPERMILPMask(const Constant *
>    assert((ElSize == 32 || ElSize == 64) && "Unexpected vector element size.");
>
>    // The shuffle mask requires elements the same size as the target.
> -  SmallBitVector UndefElts;
> +  APInt UndefElts;
>    SmallVector<uint64_t, 8> RawMask;
>    if (!extractConstantMask(C, ElSize, UndefElts, RawMask))
>      return;
> @@ -179,7 +179,7 @@ void DecodeVPERMIL2PMask(const Constant
>    assert((MaskTySize == 128 || MaskTySize == 256) && "Unexpected vector size.");
>
>    // The shuffle mask requires elements the same size as the target.
> -  SmallBitVector UndefElts;
> +  APInt UndefElts;
>    SmallVector<uint64_t, 8> RawMask;
>    if (!extractConstantMask(C, ElSize, UndefElts, RawMask))
>      return;
> @@ -230,7 +230,7 @@ void DecodeVPPERMMask(const Constant *C,
>           "Unexpected vector size.");
>
>    // The shuffle mask requires a byte vector.
> -  SmallBitVector UndefElts;
> +  APInt UndefElts;
>    SmallVector<uint64_t, 32> RawMask;
>    if (!extractConstantMask(C, 8, UndefElts, RawMask))
>      return;
> @@ -285,7 +285,7 @@ void DecodeVPERMVMask(const Constant *C,
>           "Unexpected vector element size.");
>
>    // The shuffle mask requires elements the same size as the target.
> -  SmallBitVector UndefElts;
> +  APInt UndefElts;
>    SmallVector<uint64_t, 8> RawMask;
>    if (!extractConstantMask(C, ElSize, UndefElts, RawMask))
>      return;
> @@ -313,7 +313,7 @@ void DecodeVPERMV3Mask(const Constant *C
>           "Unexpected vector element size.");
>
>    // The shuffle mask requires elements the same size as the target.
> -  SmallBitVector UndefElts;
> +  APInt UndefElts;
>    SmallVector<uint64_t, 8> RawMask;
>    if (!extractConstantMask(C, ElSize, UndefElts, RawMask))
>      return;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list