[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