Skip to content

Commit

Permalink
enhance the intrinsic info table to encode what *kind* of Any argument
Browse files Browse the repository at this point in the history
it is (at the cost of 45 bytes of extra table space) so that the verifier can
start using it.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157536 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
lattner committed May 27, 2012
1 parent e3f75f8 commit b4654c1
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 13 deletions.
2 changes: 1 addition & 1 deletion lib/VMCore/Function.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ static Type *DecodeFixedType(unsigned &NextElt, ArrayRef<unsigned char> Infos,
case IIT_ARG:
case IIT_EXTEND_VEC_ARG:
case IIT_TRUNC_VEC_ARG: {
unsigned ArgNo = NextElt == Infos.size() ? 0 : Infos[NextElt++];
unsigned ArgNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]) >> 2;
assert(ArgNo < Tys.size() && "Not enough types specified!");
Type *T = Tys[ArgNo];

Expand Down
32 changes: 20 additions & 12 deletions utils/TableGen/IntrinsicEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -372,33 +372,41 @@ static void EncodeFixedValueType(MVT::SimpleValueType VT,
#pragma optimize("",off) // MSVC 2010 optimizer can't deal with this function.
#endif

static void EncodeFixedType(Record *R, unsigned &NextArgNo,
static void EncodeFixedType(Record *R, std::vector<unsigned char> &ArgCodes,
std::vector<unsigned char> &Sig) {

if (R->isSubClassOf("LLVMMatchType")) {
unsigned Number = R->getValueAsInt("Number");
assert(Number < NextArgNo && "Invalid matching number!");
assert(Number < ArgCodes.size() && "Invalid matching number!");
if (R->isSubClassOf("LLVMExtendedElementVectorType"))
Sig.push_back(IIT_EXTEND_VEC_ARG);
else if (R->isSubClassOf("LLVMTruncatedElementVectorType"))
Sig.push_back(IIT_TRUNC_VEC_ARG);
else
Sig.push_back(IIT_ARG);
return Sig.push_back(Number);
return Sig.push_back((Number << 2) | ArgCodes[Number]);
}

MVT::SimpleValueType VT = getValueType(R->getValueAsDef("VT"));

unsigned Tmp = 0;
switch (VT) {
default: break;
case MVT::iAny:
case MVT::fAny:
case MVT::vAny:
case MVT::iPTRAny:
case MVT::iPTRAny: ++Tmp; // FALL THROUGH.
case MVT::vAny: ++Tmp; // FALL THROUGH.
case MVT::fAny: ++Tmp; // FALL THROUGH.
case MVT::iAny: {
// If this is an "any" valuetype, then the type is the type of the next
// type in the list specified to getIntrinsic().
Sig.push_back(IIT_ARG);
return Sig.push_back(NextArgNo++);

// Figure out what arg # this is consuming, and remember what kind it was.
unsigned ArgNo = ArgCodes.size();
ArgCodes.push_back(Tmp);

// Encode what sort of argument it must be in the low 2 bits of the ArgNo.
return Sig.push_back((ArgNo << 2) | Tmp);
}

case MVT::iPTR: {
unsigned AddrSpace = 0;
Expand All @@ -412,7 +420,7 @@ static void EncodeFixedType(Record *R, unsigned &NextArgNo,
} else {
Sig.push_back(IIT_PTR);
}
return EncodeFixedType(R->getValueAsDef("ElTy"), NextArgNo, Sig);
return EncodeFixedType(R->getValueAsDef("ElTy"), ArgCodes, Sig);
}
}

Expand Down Expand Up @@ -442,7 +450,7 @@ static void EncodeFixedType(Record *R, unsigned &NextArgNo,
/// intrinsic into 32 bits, return it. If not, return ~0U.
static void ComputeFixedEncoding(const CodeGenIntrinsic &Int,
std::vector<unsigned char> &TypeSig) {
unsigned NextArgNo = 0;
std::vector<unsigned char> ArgCodes;

if (Int.IS.RetVTs.empty())
TypeSig.push_back(IIT_Done);
Expand All @@ -460,11 +468,11 @@ static void ComputeFixedEncoding(const CodeGenIntrinsic &Int,
}

for (unsigned i = 0, e = Int.IS.RetVTs.size(); i != e; ++i)
EncodeFixedType(Int.IS.RetTypeDefs[i], NextArgNo, TypeSig);
EncodeFixedType(Int.IS.RetTypeDefs[i], ArgCodes, TypeSig);
}

for (unsigned i = 0, e = Int.IS.ParamTypeDefs.size(); i != e; ++i)
EncodeFixedType(Int.IS.ParamTypeDefs[i], NextArgNo, TypeSig);
EncodeFixedType(Int.IS.ParamTypeDefs[i], ArgCodes, TypeSig);
}

void printIITEntry(raw_ostream &OS, unsigned char X) {
Expand Down

0 comments on commit b4654c1

Please sign in to comment.