Author: lattner Date: Sat Jan 5 23:36:50 2008 New Revision: 45650 URL: http://llvm.org/viewvc/llvm-project?rev=45650&view=rev Log: set the 'isstore' flag for instructions whose pattern is an intrinsic that writes to memory.
Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=45650&r1=45649&r2=45650&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original) +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Sat Jan 5 23:36:50 2008 @@ -633,6 +633,22 @@ 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 @@ 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); } Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h?rev=45650&r1=45649&r2=45650&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h (original) +++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.h Sat Jan 5 23:36:50 2008 @@ -203,14 +203,17 @@ void setChild(unsigned i, TreePatternNode *N) { Children[i] = N; } - - + const std::string &getPredicateFn() const { return PredicateFn; } void setPredicateFn(const std::string &Fn) { PredicateFn = Fn; } Record *getTransformFn() const { return TransformFn; } void setTransformFn(Record *Fn) { TransformFn = Fn; } + /// getIntrinsicInfo - If this node corresponds to an intrinsic, return the + /// CodeGenIntrinsic information for it, otherwise return a null pointer. + const CodeGenIntrinsic *getIntrinsicInfo(const CodeGenDAGPatterns &CDP) const; + void print(std::ostream &OS) const; void dump() const; Modified: llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp?rev=45650&r1=45649&r2=45650&view=diff ============================================================================== --- llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp (original) +++ llvm/trunk/utils/TableGen/InstrInfoEmitter.cpp Sat Jan 5 23:36:50 2008 @@ -176,8 +176,15 @@ // Get information about the SDNode for the operator. const SDNodeInfo &OpInfo = CDP.getSDNodeInfo(N->getOperator()); - if (OpInfo.getEnumName() == "ISD::STORE") + // If this is a store node, it obviously stores to memory. + if (OpInfo.getEnumName() == "ISD::STORE") { isStore = true; + + } else if (const CodeGenIntrinsic *IntInfo = N->getIntrinsicInfo(CDP)) { + // If this is an intrinsic, analyze it. + if (IntInfo->ModRef >= CodeGenIntrinsic::WriteArgMem) + isStore = true; // Intrinsics that can write to memory are 'isStore'. + } } for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits