[llvm-commits] [llvm] r40476 - in /llvm/trunk: include/llvm/Analysis/MemoryDependenceAnalysis.h lib/Analysis/MemoryDependenceAnalysis.cpp

Owen Anderson resistor at mac.com
Tue Jul 24 14:52:37 PDT 2007


Author: resistor
Date: Tue Jul 24 16:52:37 2007
New Revision: 40476

URL: http://llvm.org/viewvc/llvm-project?rev=40476&view=rev
Log:
Add initial support for non-local memory dependence analysis.
NOTE: This has only been cursorily tested.  Expected improvements soon.

Modified:
    llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h
    llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp

Modified: llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h?rev=40476&r1=40475&r2=40476&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h (original)
+++ llvm/trunk/include/llvm/Analysis/MemoryDependenceAnalysis.h Tue Jul 24 16:52:37 2007
@@ -20,6 +20,7 @@
 #include "llvm/Pass.h"
 #include "llvm/Support/CallSite.h"
 #include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/Support/Compiler.h"
 #include <map>
 
@@ -37,6 +38,7 @@
   
     Instruction* getCallSiteDependency(CallSite C, Instruction* start,
                                        bool local = true);
+    SmallPtrSet<Instruction*, 4> nonLocalHelper(Instruction* query, BasicBlock* block);
   public:
     
     static Instruction* NonLocal;
@@ -63,7 +65,9 @@
     /// getDependency - Return the instruction on which a memory operation
     /// depends, starting with start.
     Instruction* getDependency(Instruction* query, Instruction* start = 0,
-                               bool local = true);
+                               BasicBlock* block = 0);
+    
+    SmallPtrSet<Instruction*, 4> getNonLocalDependency(Instruction* query);
     
     /// removeInstruction - Remove an instruction from the dependence analysis,
     /// updating the dependence of instructions that previously depended on it.

Modified: llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp?rev=40476&r1=40475&r2=40476&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp (original)
+++ llvm/trunk/lib/Analysis/MemoryDependenceAnalysis.cpp Tue Jul 24 16:52:37 2007
@@ -19,6 +19,7 @@
 #include "llvm/Instructions.h"
 #include "llvm/Function.h"
 #include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/Support/CFG.h"
 #include "llvm/Target/TargetData.h"
 
 using namespace llvm;
@@ -26,7 +27,7 @@
 char MemoryDependenceAnalysis::ID = 0;
   
 Instruction* MemoryDependenceAnalysis::NonLocal = (Instruction*)0;
-Instruction* MemoryDependenceAnalysis::None = (Instruction*)~0;
+Instruction* MemoryDependenceAnalysis::None = (Instruction*)(~0 - 1);
   
 // Register this pass...
 static RegisterPass<MemoryDependenceAnalysis> X("memdep",
@@ -100,15 +101,60 @@
   return NonLocal;
 }
 
+SmallPtrSet<Instruction*, 4> MemoryDependenceAnalysis::nonLocalHelper(Instruction* query,
+                                                                      BasicBlock* block) {
+  SmallPtrSet<Instruction*, 4> ret;
+  
+  Instruction* localDep = getDependency(query, block->end(), block);
+  if (localDep != NonLocal) {
+    ret.insert(localDep);
+    return ret;
+  }
+  
+  for (pred_iterator PI = pred_begin(block), PE = pred_end(block);
+       PI != PE; ++PI) {
+    SmallPtrSet<Instruction*, 4> pred_deps = nonLocalHelper(query, *PI);
+    for (SmallPtrSet<Instruction*, 4>::iterator I = pred_deps.begin(),
+         E = pred_deps.end(); I != E; ++I)
+      ret.insert(*I);
+  }
+  
+  if (ret.empty())
+    ret.insert(None);
+  
+  return ret;
+}
+
+SmallPtrSet<Instruction*, 4> MemoryDependenceAnalysis::getNonLocalDependency(Instruction* query) {
+  SmallPtrSet<Instruction*, 4> ret;
+  
+  Instruction* localDep = getDependency(query);
+  if (localDep != NonLocal) {
+    ret.insert(localDep);
+    return ret;
+  }
+  
+  BasicBlock* parent = query->getParent();
+  for (pred_iterator PI = pred_begin(parent), PE = pred_end(parent);
+       PI != PE; ++PI) {
+    SmallPtrSet<Instruction*, 4> pred_deps = nonLocalHelper(query, *PI);
+    for (SmallPtrSet<Instruction*, 4>::iterator I = pred_deps.begin(),
+         E = pred_deps.end(); I != E; ++I)
+      ret.insert(*I);
+  }
+  
+  if (ret.empty())
+    ret.insert(None);
+  
+  return ret;
+}
+
 /// getDependency - Return the instruction on which a memory operation
 /// depends.  The local paramter indicates if the query should only
 /// evaluate dependencies within the same basic block.
 Instruction* MemoryDependenceAnalysis::getDependency(Instruction* query,
                                                      Instruction* start,
-                                                     bool local) {
-  if (!local)
-    assert(0 && "Non-local memory dependence is not yet supported.");
-  
+                                                     BasicBlock* block) {
   // Start looking for dependencies with the queried inst
   BasicBlock::iterator QI = query;
   
@@ -154,7 +200,8 @@
   else
     return None;
   
-  BasicBlock::iterator blockBegin = query->getParent()->begin();
+  BasicBlock::iterator blockBegin = block ? block->begin()
+                                          : query->getParent()->begin();
   
   while (QI != blockBegin) {
     --QI;





More information about the llvm-commits mailing list