[llvm-commits] [llvm] r45650 - in /llvm/trunk/utils/TableGen: CodeGenDAGPatterns.cpp CodeGenDAGPatterns.h InstrInfoEmitter.cpp

Chris Lattner sabre at nondot.org
Sat Jan 5 21:36:50 PST 2008


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)





More information about the llvm-commits mailing list