Fix the build, and fix the handling of pointer sizes.
authorOwen Anderson <resistor@mac.com>
Tue, 10 Jul 2007 17:25:03 +0000 (17:25 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 10 Jul 2007 17:25:03 +0000 (17:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@38494 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/MemoryDependenceAnalysis.cpp

index 8ed2be35fc545f1cdad86cd9e0839b6a148e33c2..8c6886da9020fde6e2ea157ae5f3b93b553ff78e 100644 (file)
@@ -15,6 +15,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Analysis/MemoryDependenceAnalysis.h"
+#include "llvm/Constants.h"
 #include "llvm/Instructions.h"
 #include "llvm/Function.h"
 #include "llvm/Analysis/AliasAnalysis.h"
@@ -67,22 +68,18 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query,
   uint64_t dependeeSize = 0;
   if (StoreInst* S = dyn_cast<StoreInst>(QI)) {
     dependee = S->getPointerOperand();
-    dependeeSize = TD.getTypeSize(dependee->getType());
+    dependeeSize = TD.getTypeSize(S->getOperand(0)->getType());
   } else if (LoadInst* L = dyn_cast<LoadInst>(QI)) {
     dependee = L->getPointerOperand();
-    dependeeSize = TD.getTypeSize(dependee->getType());
+    dependeeSize = TD.getTypeSize(L->getType());
   } else if (FreeInst* F = dyn_cast<FreeInst>(QI)) {
     dependee = F->getPointerOperand();
     
     // FreeInsts erase the entire structure, not just a field
     dependeeSize = ~0UL;
-  } else if (isa<AllocationInst>(query)) {
-    // Allocations don't depend on anything
-    depGraphLocal.insert(std::make_pair(query, std::make_pair(None,
-                                                              true)));
-    reverseDep.insert(std::make_pair(None, query));
+  } else if (isa<AllocationInst>(query))
     return None;
-  else
+  else
     // FIXME: Call/InvokeInsts need proper handling
     return None;
   
@@ -92,26 +89,19 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query,
   while (QI != blockBegin) {
     --QI;
     
-    // If we've reached the pointer's definition...
-    if (QI == dependee) {
-      depGraphLocal.insert(std::make_pair(query, std::make_pair(QI, true)));
-      reverseDep.insert(std::make_pair(QI, query));
-      return QI;
-    }
-    
     // If this inst is a memory op, get the pointer it accessed
     Value* pointer = 0;
     uint64_t pointerSize = 0;
     if (StoreInst* S = dyn_cast<StoreInst>(QI)) {
       pointer = S->getPointerOperand();
-      pointerSize = TD.getTypeSize(pointer->getType());
+      pointerSize = TD.getTypeSize(S->getOperand(0)->getType());
     } else if (LoadInst* L = dyn_cast<LoadInst>(QI)) {
       pointer = L->getPointerOperand();
-      pointerSize = TD.getTypeSize(pointer->getType());
+      pointerSize = TD.getTypeSize(L->getType());
     } else if (AllocationInst* AI = dyn_cast<AllocationInst>(QI)) {
       pointer = AI;
-      if (isa<ConstantInt>(AI->getArraySize()))
-        pointerSize = AI->getZExtValue();
+      if (ConstantInt* C = dyn_cast<ConstantInt>(AI->getArraySize()))
+        pointerSize = C->getZExtValue();
       else
         pointerSize = ~0UL;
     } else if (FreeInst* F = dyn_cast<FreeInst>(QI)) {
@@ -119,7 +109,7 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query,
       
       // FreeInsts erase the entire structure
       pointerSize = ~0UL;
-    } else if (CallSite* C = dyn_cast<CallSite>(QI)) {
+    } else if (CallInst* C = dyn_cast<CallInst>(QI)) {
       // Call insts need special handling.  Check is they can modify our pointer
       if (AA.getModRefInfo(C, dependee, dependeeSize) != AliasAnalysis::NoModRef) {
         depGraphLocal.insert(std::make_pair(query, std::make_pair(C, true)));
@@ -128,6 +118,15 @@ Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query,
       } else {
         continue;
       }
+    } else if (InvokeInst* I = dyn_cast<InvokeInst>(QI)) {
+      // Invoke insts need special handling.  Check is they can modify our pointer
+      if (AA.getModRefInfo(I, dependee, dependeeSize) != AliasAnalysis::NoModRef) {
+        depGraphLocal.insert(std::make_pair(query, std::make_pair(I, true)));
+        reverseDep.insert(std::make_pair(I, query));
+        return I;
+      } else {
+        continue;
+      }
     }
     
     // If we found a pointer, check if it could be the same as our pointer