Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.190 -> 1.191 FileParser.y updated: 1.40 -> 1.41 Record.h updated: 1.55 -> 1.56 Record.cpp updated: 1.51 -> 1.52 --- Log message: Implement Regression/TableGen/DagDefSubst.ll --- Diffs of the changes: (+45 -41) DAGISelEmitter.cpp | 11 +++++++---- FileParser.y | 49 ++++++++++++++++++++++++------------------------- Record.cpp | 8 +++++--- Record.h | 18 +++++++++--------- 4 files changed, 45 insertions(+), 41 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.190 llvm/utils/TableGen/DAGISelEmitter.cpp:1.191 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.190 Mon Mar 27 18:41:33 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Thu Mar 30 16:50:40 2006 @@ -804,7 +804,9 @@ } TreePatternNode *TreePattern::ParseTreePattern(DagInit *Dag) { - Record *Operator = Dag->getNodeType(); + DefInit *OpDef = dynamic_cast<DefInit*>(Dag->getOperator()); + if (!OpDef) error("Pattern has unexpected operator type!"); + Record *Operator = OpDef->getDef(); if (Operator->isSubClassOf("ValueType")) { // If the operator is a ValueType, then this must be "type cast" of a leaf @@ -817,7 +819,7 @@ if (DefInit *DI = dynamic_cast<DefInit*>(Arg)) { Record *R = DI->getDef(); if (R->isSubClassOf("SDNode") || R->isSubClassOf("PatFrag")) { - Dag->setArg(0, new DagInit(R, + Dag->setArg(0, new DagInit(DI, std::vector<std::pair<Init*, std::string> >())); return ParseTreePattern(Dag); } @@ -866,7 +868,7 @@ // Direct reference to a leaf DagNode or PatFrag? Turn it into a // TreePatternNode if its own. if (R->isSubClassOf("SDNode") || R->isSubClassOf("PatFrag")) { - Dag->setArg(i, new DagInit(R, + Dag->setArg(i, new DagInit(DefI, std::vector<std::pair<Init*, std::string> >())); --i; // Revisit this node... } else { @@ -1043,7 +1045,8 @@ // Parse the operands list. DagInit *OpsList = Fragments[i]->getValueAsDag("Operands"); - if (OpsList->getNodeType()->getName() != "ops") + DefInit *OpsOp = dynamic_cast<DefInit*>(OpsList->getOperator()); + if (!OpsOp || OpsOp->getDef()->getName() != "ops") P->error("Operands list should start with '(ops ... '!"); // Copy over the arguments. Index: llvm/utils/TableGen/FileParser.y diff -u llvm/utils/TableGen/FileParser.y:1.40 llvm/utils/TableGen/FileParser.y:1.41 --- llvm/utils/TableGen/FileParser.y:1.40 Tue Jan 31 00:02:35 2006 +++ llvm/utils/TableGen/FileParser.y Thu Mar 30 16:50:40 2006 @@ -210,7 +210,7 @@ %type <SubClassRef> SubClassRef %type <SubClassList> ClassList ClassListNE %type <IntVal> OptPrefix -%type <Initializer> Value OptValue +%type <Initializer> Value OptValue IDValue %type <DagValueList> DagArgList DagArgListNE %type <FieldList> ValueList ValueListNE %type <BitList> BitList OptBitList RBitList @@ -253,7 +253,26 @@ OptValue : /*empty*/ { $$ = 0; } | '=' Value { $$ = $2; }; -Value : INTVAL { +IDValue : ID { + if (const RecordVal *RV = (CurRec ? CurRec->getValue(*$1) : 0)) { + $$ = new VarInit(*$1, RV->getType()); + } else if (CurRec && CurRec->isTemplateArg(CurRec->getName()+":"+*$1)) { + const RecordVal *RV = CurRec->getValue(CurRec->getName()+":"+*$1); + assert(RV && "Template arg doesn't exist??"); + $$ = new VarInit(CurRec->getName()+":"+*$1, RV->getType()); + } else if (Record *D = Records.getDef(*$1)) { + $$ = new DefInit(D); + } else { + err() << "Variable not defined: '" << *$1 << "'!\n"; + exit(1); + } + + delete $1; +}; + +Value : IDValue { + $$ = $1; + } | INTVAL { $$ = new IntInit($1); } | STRVAL { $$ = new StringInit(*$1); @@ -304,21 +323,6 @@ // Restore the old CurRec CurRec = OldRec; - } | ID { - if (const RecordVal *RV = (CurRec ? CurRec->getValue(*$1) : 0)) { - $$ = new VarInit(*$1, RV->getType()); - } else if (CurRec && CurRec->isTemplateArg(CurRec->getName()+":"+*$1)) { - const RecordVal *RV = CurRec->getValue(CurRec->getName()+":"+*$1); - assert(RV && "Template arg doesn't exist??"); - $$ = new VarInit(CurRec->getName()+":"+*$1, RV->getType()); - } else if (Record *D = Records.getDef(*$1)) { - $$ = new DefInit(D); - } else { - err() << "Variable not defined: '" << *$1 << "'!\n"; - exit(1); - } - - delete $1; } | Value '{' BitList '}' { $$ = $1->convertInitializerBitRange(*$3); if ($$ == 0) { @@ -336,14 +340,9 @@ } $$ = new FieldInit($1, *$3); delete $3; - } | '(' ID DagArgList ')' { - Record *D = Records.getDef(*$2); - if (D == 0) { - err() << "Invalid def '" << *$2 << "'!\n"; - exit(1); - } - $$ = new DagInit(D, *$3); - delete $2; delete $3; + } | '(' IDValue DagArgList ')' { + $$ = new DagInit($2, *$3); + delete $3; } | Value '[' BitList ']' { std::reverse($3->begin(), $3->end()); $$ = $1->convertInitListSlice(*$3); Index: llvm/utils/TableGen/Record.h diff -u llvm/utils/TableGen/Record.h:1.55 llvm/utils/TableGen/Record.h:1.56 --- llvm/utils/TableGen/Record.h:1.55 Tue Jan 31 00:02:35 2006 +++ llvm/utils/TableGen/Record.h Thu Mar 30 16:50:40 2006 @@ -808,17 +808,17 @@ } }; -/// DagInit - (def a, b) - Represent a DAG tree value. DAG inits are required -/// to have Records for their first value, after that, any legal Init is -/// possible. +/// DagInit - (v a, b) - Represent a DAG tree value. DAG inits are required +/// to have at least one value then a (possibly empty) list of arguments. Each +/// argument can have a name associated with it. /// class DagInit : public Init { - Record *NodeTypeDef; + Init *Val; std::vector<Init*> Args; std::vector<std::string> ArgNames; public: - DagInit(Record *D, const std::vector<std::pair<Init*, std::string> > &args) - : NodeTypeDef(D) { + DagInit(Init *V, const std::vector<std::pair<Init*, std::string> > &args) + : Val(V) { Args.reserve(args.size()); ArgNames.reserve(args.size()); for (unsigned i = 0, e = args.size(); i != e; ++i) { @@ -826,16 +826,16 @@ ArgNames.push_back(args[i].second); } } - DagInit(Record *D, const std::vector<Init*> &args, + DagInit(Init *V, const std::vector<Init*> &args, const std::vector<std::string> &argNames) - : NodeTypeDef(D), Args(args), ArgNames(argNames) { + : Val(V), Args(args), ArgNames(argNames) { } virtual Init *convertInitializerTo(RecTy *Ty) { return Ty->convertValue(this); } - Record *getNodeType() const { return NodeTypeDef; } + Init *getOperator() const { return Val; } unsigned getNumArgs() const { return Args.size(); } Init *getArg(unsigned Num) const { Index: llvm/utils/TableGen/Record.cpp diff -u llvm/utils/TableGen/Record.cpp:1.51 llvm/utils/TableGen/Record.cpp:1.52 --- llvm/utils/TableGen/Record.cpp:1.51 Fri Feb 17 21:20:33 2006 +++ llvm/utils/TableGen/Record.cpp Thu Mar 30 16:50:40 2006 @@ -559,15 +559,17 @@ for (unsigned i = 0, e = Args.size(); i != e; ++i) NewArgs.push_back(Args[i]->resolveReferences(R, RV)); - if (Args != NewArgs) - return new DagInit(NodeTypeDef, NewArgs, ArgNames); + Init *Op = Val->resolveReferences(R, RV); + + if (Args != NewArgs || Op != Val) + return new DagInit(Op, NewArgs, ArgNames); return this; } void DagInit::print(std::ostream &OS) const { - OS << "(" << NodeTypeDef->getName(); + OS << "(" << *Val; if (Args.size()) { OS << " " << *Args[0]; if (!ArgNames[0].empty()) OS << ":$" << ArgNames[0]; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits