realize that instructions who match intrinsics that read memory read memory.
authorChris Lattner <sabre@nondot.org>
Thu, 10 Jan 2008 04:38:57 +0000 (04:38 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 10 Jan 2008 04:38:57 +0000 (04:38 +0000)
Also, instructions with any nodes that are SDNPMayLoad also read memory.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45817 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/CodeGenDAGPatterns.cpp
utils/TableGen/CodeGenTarget.h
utils/TableGen/InstrInfoEmitter.cpp

index 5a826cd0f18960ea74d5348605f02e09bbfbee03..ee2d63467946344b8683db3336ad49846fd2aca6 100644 (file)
@@ -319,6 +319,8 @@ SDNodeInfo::SDNodeInfo(Record *R) : Def(R) {
       Properties |= 1 << SDNPOptInFlag;
     } else if (PropList[i]->getName() == "SDNPMayStore") {
       Properties |= 1 << SDNPMayStore;
+    } else if (PropList[i]->getName() == "SDNPMayLoad") {
+      Properties |= 1 << SDNPMayLoad;
     } else {
       cerr << "Unknown SD Node property '" << PropList[i]->getName()
            << "' on node '" << R->getName() << "'!\n";
index 02afe95547206f8ae6181b99542eaee9c2fbb501..07407334196755a2278ac44d450e1855a4363e2e 100644 (file)
@@ -37,6 +37,7 @@ enum SDNP {
   SDNPOutFlag,
   SDNPInFlag,
   SDNPOptInFlag,
+  SDNPMayLoad,
   SDNPMayStore
 };
 
index 1c1973f9a50f87b491b16f188888e0bf2ca31e87..f4b9179cd0d09d296a3c722f865677f982adaabc 100644 (file)
@@ -174,12 +174,21 @@ private:
       const SDNodeInfo &OpInfo = CDP.getSDNodeInfo(N->getOperator());
       
       // If node writes to memory, it obviously stores to memory.
-      if (OpInfo.hasProperty(SDNPMayStore)) {
+      if (OpInfo.hasProperty(SDNPMayStore))
         mayStore = true;
-      } else if (const CodeGenIntrinsic *IntInfo = N->getIntrinsicInfo(CDP)) {
+      
+      // If it reads memory, remember this.
+      if (OpInfo.hasProperty(SDNPMayLoad))
+        mayLoad = true;
+      
+      if (const CodeGenIntrinsic *IntInfo = N->getIntrinsicInfo(CDP)) {
         // If this is an intrinsic, analyze it.
-        if (IntInfo->ModRef >= CodeGenIntrinsic::WriteArgMem)
+        if (IntInfo->ModRef >= CodeGenIntrinsic::WriteArgMem) {
           mayStore = true;// Intrinsics that can write to memory are 'mayStore'.
+        }
+        
+        if (IntInfo->ModRef >= CodeGenIntrinsic::ReadArgMem)
+          mayLoad  = true;// These may also load memory.
       }
     }