diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index 2994d4812b8..b557892b3b3 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -264,8 +264,16 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {      std::vector<SDOperand> Ops;      bool Changed = false;      for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { -      Ops.push_back(LegalizeOp(Node->getOperand(i)));  // Legalize the operands -      Changed |= Ops[i] != Node->getOperand(i); +      SDOperand Op = Node->getOperand(i); +      // Fold single-use TokenFactor nodes into this token factor as we go. +      if (Op.getOpcode() == ISD::TokenFactor && Op.hasOneUse()) { +        Changed = true; +        for (unsigned j = 0, e = Op.getNumOperands(); j != e; ++j) +          Ops.push_back(LegalizeOp(Op.getOperand(j))); +      } else { +        Ops.push_back(LegalizeOp(Op));  // Legalize the operands +        Changed |= Ops[i] != Op; +      }      }      if (Changed)        Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Ops);  | 

