diff options
author | Chris Lattner <sabre@nondot.org> | 2008-01-06 05:36:50 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2008-01-06 05:36:50 +0000 |
commit | e67bde5bb1959dbd7085981cb0bcf6f7c749f724 (patch) | |
tree | 511e04e3480c2ba0f50f9170f02118d82dfaeb99 /utils/TableGen/CodeGenDAGPatterns.cpp | |
parent | e81cd881b165fd4197a25e21a88e25f781754e55 (diff) |
set the 'isstore' flag for instructions whose pattern is an
intrinsic that writes to memory.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45650 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenDAGPatterns.cpp')
-rw-r--r-- | utils/TableGen/CodeGenDAGPatterns.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/utils/TableGen/CodeGenDAGPatterns.cpp b/utils/TableGen/CodeGenDAGPatterns.cpp index 7e2830782f..52610cfaa4 100644 --- a/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/utils/TableGen/CodeGenDAGPatterns.cpp @@ -633,6 +633,22 @@ static std::vector<unsigned char> getImplicitType(Record *R, bool NotRegisters, return Other; } + +/// getIntrinsicInfo - If this node corresponds to an intrinsic, return the +/// CodeGenIntrinsic information for it, otherwise return a null pointer. +const CodeGenIntrinsic *TreePatternNode:: +getIntrinsicInfo(const CodeGenDAGPatterns &CDP) const { + if (getOperator() != CDP.get_intrinsic_void_sdnode() && + getOperator() != CDP.get_intrinsic_w_chain_sdnode() && + getOperator() != CDP.get_intrinsic_wo_chain_sdnode()) + return 0; + + unsigned IID = + dynamic_cast<IntInit*>(getChild(0)->getLeafValue())->getValue(); + return &CDP.getIntrinsicInfo(IID); +} + + /// ApplyTypeConstraints - Apply all of the type constraints relevent to /// this node and its children in the tree. This returns true if it makes a /// change, false otherwise. If a type contradiction is found, throw an @@ -699,27 +715,22 @@ bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) { MadeChange = getChild(i)->ApplyTypeConstraints(TP, NotRegisters); MadeChange |= UpdateNodeType(MVT::isVoid, TP); return MadeChange; - } else if (getOperator() == CDP.get_intrinsic_void_sdnode() || - getOperator() == CDP.get_intrinsic_w_chain_sdnode() || - getOperator() == CDP.get_intrinsic_wo_chain_sdnode()) { - unsigned IID = - dynamic_cast<IntInit*>(getChild(0)->getLeafValue())->getValue(); - const CodeGenIntrinsic &Int = CDP.getIntrinsicInfo(IID); + } else if (const CodeGenIntrinsic *Int = getIntrinsicInfo(CDP)) { bool MadeChange = false; // Apply the result type to the node. - MadeChange = UpdateNodeType(Int.ArgVTs[0], TP); + MadeChange = UpdateNodeType(Int->ArgVTs[0], TP); - if (getNumChildren() != Int.ArgVTs.size()) - TP.error("Intrinsic '" + Int.Name + "' expects " + - utostr(Int.ArgVTs.size()-1) + " operands, not " + + if (getNumChildren() != Int->ArgVTs.size()) + TP.error("Intrinsic '" + Int->Name + "' expects " + + utostr(Int->ArgVTs.size()-1) + " operands, not " + utostr(getNumChildren()-1) + " operands!"); // Apply type info to the intrinsic ID. MadeChange |= getChild(0)->UpdateNodeType(MVT::iPTR, TP); for (unsigned i = 1, e = getNumChildren(); i != e; ++i) { - MVT::ValueType OpVT = Int.ArgVTs[i]; + MVT::ValueType OpVT = Int->ArgVTs[i]; MadeChange |= getChild(i)->UpdateNodeType(OpVT, TP); MadeChange |= getChild(i)->ApplyTypeConstraints(TP, NotRegisters); } |