[llvm-commits] [llvm] r124145 - in /llvm/trunk/utils/TableGen: CodeGenDAGPatterns.cpp CodeGenDAGPatterns.h

Evan Cheng evan.cheng at apple.com
Mon Jan 24 15:15:23 PST 2011


Hi David,

What's your plan? Please elaborate.

Evan

On Jan 24, 2011, at 12:53 PM, David Greene wrote:

> Author: greened
> Date: Mon Jan 24 14:53:18 2011
> New Revision: 124145
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=124145&view=rev
> Log:
> 
> [AVX] Add type checking support for vector/subvector type constraints.
> This will be used to check patterns referencing a forthcoming
> INSERT_SUBVECTOR SDNode.  INSERT_SUBVECTOR in turn is very useful for
> matching to VINSERTF128 instructions and complements the already
> existing EXTRACT_SUBVECTOR SDNode.
> 
> Modified:
>    llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
>    llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h
> 
> Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=124145&r1=124144&r2=124145&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original)
> +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Mon Jan 24 14:53:18 2011
> @@ -434,6 +434,36 @@
>   return MadeChange;
> }
> 
> +/// EnforceVectorSubVectorTypeIs - 'this' is now constrainted to be a
> +/// vector type specified by VTOperand.
> +bool EEVT::TypeSet::EnforceVectorSubVectorTypeIs(EEVT::TypeSet &VTOperand,
> +                                                 TreePattern &TP) {
> +  // "This" must be a vector and "VTOperand" must be a vector.
> +  bool MadeChange = false;
> +  MadeChange |= EnforceVector(TP);
> +  MadeChange |= VTOperand.EnforceVector(TP);
> +
> +  // "This" must be larger than "VTOperand."
> +  MadeChange |= VTOperand.EnforceSmallerThan(*this, TP);
> +
> +  // If we know the vector type, it forces the scalar types to agree.
> +  if (isConcrete()) {
> +    EVT IVT = getConcrete();
> +    IVT = IVT.getVectorElementType();
> +
> +    EEVT::TypeSet EltTypeSet(IVT.getSimpleVT().SimpleTy, TP);
> +    MadeChange |= VTOperand.EnforceVectorEltTypeIs(EltTypeSet, TP);
> +  } else if (VTOperand.isConcrete()) {
> +    EVT IVT = VTOperand.getConcrete();
> +    IVT = IVT.getVectorElementType();
> +
> +    EEVT::TypeSet EltTypeSet(IVT.getSimpleVT().SimpleTy, TP);
> +    MadeChange |= EnforceVectorEltTypeIs(EltTypeSet, TP);
> +  }
> +
> +  return MadeChange;
> +}
> +
> //===----------------------------------------------------------------------===//
> // Helpers for working with extended types.
> 
> @@ -605,6 +635,10 @@
>   } else if (R->isSubClassOf("SDTCisEltOfVec")) {
>     ConstraintType = SDTCisEltOfVec;
>     x.SDTCisEltOfVec_Info.OtherOperandNum = R->getValueAsInt("OtherOpNum");
> +  } else if (R->isSubClassOf("SDTCisSubVecOfVec")) {
> +    ConstraintType = SDTCisSubVecOfVec;
> +    x.SDTCisSubVecOfVec_Info.OtherOperandNum =
> +      R->getValueAsInt("OtherOpNum");
>   } else {
>     errs() << "Unrecognized SDTypeConstraint '" << R->getName() << "'!\n";
>     exit(1);
> @@ -708,6 +742,17 @@
>     return VecOperand->getExtType(VResNo).
>       EnforceVectorEltTypeIs(NodeToApply->getExtType(ResNo), TP);
>   }
> +  case SDTCisSubVecOfVec: {
> +    unsigned VResNo = 0;
> +    TreePatternNode *BigVecOperand =
> +      getOperandNum(x.SDTCisSubVecOfVec_Info.OtherOperandNum, N, NodeInfo,
> +                    VResNo);
> +
> +    // Filter vector types out of BigVecOperand that don't have the
> +    // right subvector type.
> +    return BigVecOperand->getExtType(VResNo).
> +      EnforceVectorSubVectorTypeIs(NodeToApply->getExtType(ResNo), TP);
> +  }
>   }
>   return false;
> }
> 
> Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h?rev=124145&r1=124144&r2=124145&view=diff
> ==============================================================================
> --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h (original)
> +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h Mon Jan 24 14:53:18 2011
> @@ -131,6 +131,10 @@
>     /// whose element is VT.
>     bool EnforceVectorEltTypeIs(EEVT::TypeSet &VT, TreePattern &TP);
> 
> +    /// EnforceVectorSubVectorTypeIs - 'this' is now constrainted to
> +    /// be a vector type VT.
> +    bool EnforceVectorSubVectorTypeIs(EEVT::TypeSet &VT, TreePattern &TP);
> +
>     bool operator!=(const TypeSet &RHS) const { return TypeVec != RHS.TypeVec; }
>     bool operator==(const TypeSet &RHS) const { return TypeVec == RHS.TypeVec; }
> 
> @@ -155,7 +159,8 @@
>   unsigned OperandNo;   // The operand # this constraint applies to.
>   enum {
>     SDTCisVT, SDTCisPtrTy, SDTCisInt, SDTCisFP, SDTCisVec, SDTCisSameAs,
> -    SDTCisVTSmallerThanOp, SDTCisOpSmallerThanOp, SDTCisEltOfVec
> +    SDTCisVTSmallerThanOp, SDTCisOpSmallerThanOp, SDTCisEltOfVec,
> +    SDTCisSubVecOfVec
>   } ConstraintType;
> 
>   union {   // The discriminated union.
> @@ -174,6 +179,9 @@
>     struct {
>       unsigned OtherOperandNum;
>     } SDTCisEltOfVec_Info;
> +    struct {
> +      unsigned OtherOperandNum;
> +    } SDTCisSubVecOfVec_Info;
>   } x;
> 
>   /// ApplyTypeConstraint - Given a node in a pattern, apply this type
> 
> 
> _______________________________________________
> 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