[vmkit-commits] [vmkit] r68644 - in /vmkit/trunk/lib: JnJVM/Compiler/JnjvmModule.cpp Mvm/Compiler/EscapeAnalysis.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Apr 8 14:07:52 PDT 2009


Author: geoffray
Date: Wed Apr  8 16:07:52 2009
New Revision: 68644

URL: http://llvm.org/viewvc/llvm-project?rev=68644&view=rev
Log:
Do not stack allocate allocations which happen during a loop. Hopefully
that will be supported some day...


Modified:
    vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
    vmkit/trunk/lib/Mvm/Compiler/EscapeAnalysis.cpp

Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=68644&r1=68643&r2=68644&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Wed Apr  8 16:07:52 2009
@@ -529,7 +529,7 @@
 }
 
 namespace mvm {
-  llvm::FunctionPass* createEscapeAnalysisPass(llvm::Function*);
+  llvm::FunctionPass* createEscapeAnalysisPass();
 }
 
 namespace jnjvm {
@@ -545,7 +545,6 @@
   
   JavaFunctionPasses = new FunctionPassManager(TheModuleProvider);
   JavaFunctionPasses->add(new TargetData(TheModule));
-  Function* func = JavaIntrinsics.JavaObjectAllocateFunction;
-  JavaFunctionPasses->add(mvm::createEscapeAnalysisPass(func));
+  JavaFunctionPasses->add(mvm::createEscapeAnalysisPass());
   JavaFunctionPasses->add(createLowerConstantCallsPass());
 }

Modified: vmkit/trunk/lib/Mvm/Compiler/EscapeAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/EscapeAnalysis.cpp?rev=68644&r1=68643&r2=68644&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/EscapeAnalysis.cpp (original)
+++ vmkit/trunk/lib/Mvm/Compiler/EscapeAnalysis.cpp Wed Apr  8 16:07:52 2009
@@ -11,13 +11,15 @@
 #include "llvm/Constants.h"
 #include "llvm/Function.h"
 #include "llvm/GlobalVariable.h"
+#include "llvm/Module.h"
 #include "llvm/Pass.h"
 #include "llvm/Instructions.h"
+#include "llvm/Analysis/LoopInfo.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/Debug.h"
 
+#include <cstddef>
 #include <map>
-#include "unistd.h"
 
 #include "mvm/GC/GC.h"
 
@@ -29,24 +31,38 @@
   public:
     static char ID;
     uint64_t pageSize;
-    EscapeAnalysis(Function* alloc = 0) : 
-      FunctionPass((intptr_t)&ID) {
-      Allocator = alloc;
+    EscapeAnalysis() : FunctionPass((intptr_t)&ID) {
       pageSize = getpagesize();
     }
 
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.addRequired<LoopInfo>();
+    }
+
     virtual bool runOnFunction(Function &F);
+
   private:
-    Function* Allocator;
     bool processMalloc(Instruction* I, Value* Size, Value* VT);
   };
+
   char EscapeAnalysis::ID = 0;
   RegisterPass<EscapeAnalysis> X("EscapeAnalysis", "Escape Analysis Pass");
 
 bool EscapeAnalysis::runOnFunction(Function& F) {
   bool Changed = false;
+  Function* Allocator = F.getParent()->getFunction("gcmalloc");
+  if (!Allocator) return Changed;
+
+  LoopInfo* LI = &getAnalysis<LoopInfo>();
+
   for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; BI++) { 
-    BasicBlock *Cur = BI; 
+    BasicBlock *Cur = BI;
+   
+    // Don't bother if we're in a loop. We rely on the memory manager to
+    // allocate with a bump pointer allocator. Sure we could analyze more
+    // to see if the object could in fact be stack allocated, but just be
+    // lazy for now.
+    if (LI->getLoopFor(Cur)) continue;
 
     for (BasicBlock::iterator II = Cur->begin(), IE = Cur->end(); II != IE;) {
       Instruction *I = II;
@@ -162,8 +178,8 @@
 }
 
 namespace mvm {
-FunctionPass* createEscapeAnalysisPass(llvm::Function* alloc) {
-
-  return new EscapeAnalysis(alloc);
+FunctionPass* createEscapeAnalysisPass() {
+  return new EscapeAnalysis();
 }
+
 }





More information about the vmkit-commits mailing list