[llvm-commits] [llvm] r65426 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAGNodes.h lib/CodeGen/SelectionDAG/SelectionDAG.cpp lib/Target/PowerPC/PPCISelLowering.cpp

Evan Cheng evan.cheng at apple.com
Wed Feb 25 00:30:33 PST 2009


Thanks. But there are more failures. Are you still working on  
reverting the BuildVectorSDNode patch?

Evan

On Feb 24, 2009, at 7:12 PM, Scott Michel <scottm at aero.org> wrote:

> Author: pingbak
> Date: Tue Feb 24 21:12:50 2009
> New Revision: 65426
>
> URL: http://llvm.org/viewvc/llvm-project?rev=65426&view=rev
> Log:
> Remove all "cached" data from BuildVectorSDNode, preferring to  
> retrieve
> results via reference parameters.
>
> This patch also appears to fix Evan's reported problem supplied as a
> reduced bugpoint test case.
>
> Modified:
>    llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
>    llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h?rev=65426&r1=65425&r2=65426&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/SelectionDAGNodes.h Tue Feb 24  
> 21:12:50 2009
> @@ -1933,13 +1933,6 @@
> /// encapsulate common BUILD_VECTOR code and operations such as  
> constant splat
> /// testing.
> class BuildVectorSDNode : public SDNode {
> -  //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
> -  // Constant splat state:
> -  //-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~
> -  //! We've computed the splat already?
> -  bool computedSplat;
> -  //! It is a splat?
> -  bool isSplatVector;
>   //! Splat has undefined bits in it
>   bool hasUndefSplatBitsFlag;
>   //! The splat value
> @@ -1959,36 +1952,25 @@
> public:
>   //! Constant splat predicate.
>   /*!
> -   Determine if this ISD::BUILD_VECTOR is a constant splat. The  
> results are
> -   cached to prevent recomputation.
> -
> -   @param MinSplatBits: minimum number of bits in the constant  
> splat, defaults
> +   Determine if this ISD::BUILD_VECTOR is a constant splat. This  
> method
> +   returns information about the splat in \a hasUndefSplatBitsFlag,
> +   \a SplatBits, \a SplatUndef and \a SplatSize if the return value  
> is
> +   true.
> +
> +   \param[out] hasUndefSplatBitsFlag: true if the constant splat  
> contains
> +          any undefined bits in the splat.
> +   \param[out] SplatBits: The constant splat value
> +   \param[out] SplatUndef: The undefined bits in the splat value
> +   \param[out] SplatSize: The size of the constant splat in bytes
> +   \param MinSplatBits: minimum number of bits in the constant  
> splat, defaults
>           to 0 for 'don't care', but normally one of [8, 16, 32, 64].
> -   @return true if the splat has the required minimum number of  
> bits and the
> +
> +   \return true if the splat has the required minimum number of  
> bits and the
>            splat really is a constant splat (accounting for undef  
> bits).
>    */
> -  bool isConstantSplat(int MinSplatBits = 0);
> -
> -  //! Get the splatbits
> -  uint64_t getSplatBits() const {
> -    assert(computedSplat && "BuildVectorSDNode: compute splat bits  
> first!");
> -    return SplatBits;
> -  }
> -
> -  uint64_t getSplatUndef() const {
> -    assert(computedSplat && "BuildVectorSDNode: compute splat bits  
> first!");
> -    return SplatUndef;
> -  }
> -
> -  unsigned getSplatSize() const {
> -    assert(computedSplat && "BuildVectorSDNode: compute splat bits  
> first!");
> -    return SplatSize;
> -  }
> -
> -  bool hasAnyUndefBits() const {
> -    assert(computedSplat && "BuildVectorSDNode: compute splat bits  
> first!");
> -    return hasUndefSplatBitsFlag;
> -  }
> +  bool isConstantSplat(bool &hasUndefSplatBitsFlag, uint64_t  
> &SplatBits,
> +                       uint64_t &SplatUndef, unsigned &SplatSize,
> +               int MinSplatBits = 0);
>
>   static bool classof(const BuildVectorSDNode *) { return true; }
>   static bool classof(const SDNode *N) {
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=65426&r1=65425&r2=65426&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Tue Feb 24  
> 21:12:50 2009
> @@ -4856,27 +4856,25 @@
>
> BuildVectorSDNode::BuildVectorSDNode(MVT vecVT, DebugLoc dl,
>                     const SDValue *Elts, unsigned NumElts)
> -  : SDNode(ISD::BUILD_VECTOR, dl, getSDVTList(vecVT), Elts, NumElts),
> -    computedSplat(false), isSplatVector(false),  
> hasUndefSplatBitsFlag(false),
> -    SplatBits(0LL), SplatUndef(0LL), SplatSize(0)
> +  : SDNode(ISD::BUILD_VECTOR, dl, getSDVTList(vecVT), Elts, NumElts)
> { }
>
> -bool BuildVectorSDNode::isConstantSplat(int MinSplatBits)  {
> +bool BuildVectorSDNode::isConstantSplat(bool &hasUndefSplatBitsFlag,
> +                                        uint64_t &SplatBits,
> +                                        uint64_t &SplatUndef,
> +                    unsigned &SplatSize,
> +                                int MinSplatBits) {
>   unsigned int nOps = getNumOperands();
>   assert(nOps > 0 && "isConstantSplat has 0-size build vector");
>
> -  // Return early if we already know the answer:
> -  if (computedSplat)
> -    return isSplatVector;
> +  // Assume that this isn't a constant splat.
> +  bool isSplatVector = false;
>
>   // The vector's used (non-undef) bits
>   uint64_t VectorBits[2] = { 0, 0 };
>   // The vector's undefined bits
>   uint64_t UndefBits[2] = { 0, 0 };
>
> -  // Assume that this isn't a constant splat.
> -  isSplatVector = false;
> -
>   // Gather the constant and undefined bits
>   unsigned EltBitSize = getOperand(0).getValueType().getSizeInBits();
>   for (unsigned i = 0; i < nOps; ++i) {
> @@ -4901,7 +4899,6 @@
>    EltBits = DoubleToBits(apf.convertToDouble());
>     } else {
>       // Nonconstant element -> not a splat.
> -      computedSplat = true;
>       return isSplatVector;
>     }
>
> @@ -4910,7 +4907,6 @@
>
>   if ((VectorBits[0] & ~UndefBits[1]) != (VectorBits[1] &  
> ~UndefBits[0])) {
>     // Can't be a splat if two pieces don't match.
> -    computedSplat = true;
>     return isSplatVector;
>   }
>
> @@ -4954,7 +4950,6 @@
>     isSplatVector = true;
>   }
>
> -  computedSplat = true;
>   return isSplatVector;
> }
>
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=65426&r1=65425&r2=65426&view=diff
>
> === 
> === 
> === 
> =====================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Tue Feb 24  
> 21:12:50 2009
> @@ -3171,16 +3171,16 @@
>   BuildVectorSDNode *BVN = dyn_cast<BuildVectorSDNode>(Op.getNode());
>   assert(BVN != 0 && "Expected a BuildVectorSDNode in  
> LowerBUILD_VECTOR");
>
> +  uint64_t SplatBits;
> +  uint64_t SplatUndef;
> +  unsigned SplatSize;
> +  bool HasAnyUndefs;
> +
>   // If this is a splat (repetition) of a value across the whole  
> vector, return
>   // the smallest size that splats it.  For example,  
> "0x01010101010101..." is a
>   // splat of 0x01, 0x0101, and 0x01010101.  We return SplatBits =  
> 0x01 and
>   // SplatSize = 1 byte.
> -  if (BVN->isConstantSplat()) {
> -    uint64_t SplatBits = BVN->getSplatBits();
> -    uint64_t SplatUndef = BVN->getSplatUndef();
> -    unsigned SplatSize = BVN->getSplatSize();
> -    bool HasAnyUndefs = BVN->hasAnyUndefBits();
> -
> +  if (BVN->isConstantSplat(HasAnyUndefs, SplatBits, SplatUndef,  
> SplatSize)) {
>     // First, handle single instruction cases.
>
>     // All zeros?
>
>
> _______________________________________________
> 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