diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/utils/TableGen/CodeGenDAGPatterns.cpp | 20 | 
1 files changed, 10 insertions, 10 deletions
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp index 2ebcd80147c..1eae1c75e11 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp @@ -1222,8 +1222,7 @@ static unsigned GetNumNodeResults(Record *Operator, CodeGenDAGPatterns &CDP) {    if (Operator->isSubClassOf("Instruction")) {      CodeGenInstruction &InstInfo = CDP.getTargetInfo().getInstruction(Operator); -    // FIXME: Should allow access to all the results here. -    unsigned NumDefsToAdd = InstInfo.Operands.NumDefs ? 1 : 0; +    unsigned NumDefsToAdd = InstInfo.Operands.NumDefs;      // Add on one implicit def if it has a resolvable type.      if (InstInfo.HasOneImplicitDefWithKnownVT(CDP.getTargetInfo()) !=MVT::Other) @@ -1800,8 +1799,7 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {      // Apply the result types to the node, these come from the things in the      // (outs) list of the instruction. -    // FIXME: Cap at one result so far. -    unsigned NumResultsToAdd = InstInfo.Operands.NumDefs ? 1 : 0; +    unsigned NumResultsToAdd = InstInfo.Operands.NumDefs;      for (unsigned ResNo = 0; ResNo != NumResultsToAdd; ++ResNo)        MadeChange |= UpdateNodeTypeFromInst(ResNo, Inst.getResult(ResNo), TP); @@ -2967,7 +2965,7 @@ const DAGInstruction &CodeGenDAGPatterns::parseInstructionPattern(      // Check that all of the results occur first in the list.      std::vector<Record*> Results; -    TreePatternNode *Res0Node = nullptr; +    SmallVector<TreePatternNode *, 2> ResNodes;      for (unsigned i = 0; i != NumResults; ++i) {        if (i == CGI.Operands.size())          I->error("'" + InstResults.begin()->first + @@ -2979,8 +2977,8 @@ const DAGInstruction &CodeGenDAGPatterns::parseInstructionPattern(        if (!RNode)          I->error("Operand $" + OpName + " does not exist in operand list!"); -      if (i == 0) -        Res0Node = RNode; +      ResNodes.push_back(RNode); +        Record *R = cast<DefInit>(RNode->getLeafValue())->getDef();        if (!R)          I->error("Operand $" + OpName + " should be a set destination: all " @@ -3055,9 +3053,11 @@ const DAGInstruction &CodeGenDAGPatterns::parseInstructionPattern(      TreePatternNode *ResultPattern =        new TreePatternNode(I->getRecord(), ResultNodeOperands,                            GetNumNodeResults(I->getRecord(), *this)); -    // Copy fully inferred output node type to instruction result pattern. -    for (unsigned i = 0; i != NumResults; ++i) -      ResultPattern->setType(i, Res0Node->getExtType(i)); +    // Copy fully inferred output node types to instruction result pattern. +    for (unsigned i = 0; i != NumResults; ++i) { +      assert(ResNodes[i]->getNumTypes() == 1 && "FIXME: Unhandled"); +      ResultPattern->setType(i, ResNodes[i]->getExtType(0)); +    }      // Create and insert the instruction.      // FIXME: InstImpResults should not be part of DAGInstruction.  | 

