[vmkit-commits] [vmkit] r65324 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaJIT.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h VMCore/LowerConstantCalls.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Feb 23 09:18:29 PST 2009


Author: geoffray
Date: Mon Feb 23 11:18:28 2009
New Revision: 65324

URL: http://llvm.org/viewvc/llvm-project?rev=65324&view=rev
Log:
Optimization of final virtual fields.


Modified:
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
    vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp

Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=65324&r1=65323&r2=65324&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Mon Feb 23 11:18:28 2009
@@ -191,6 +191,14 @@
 declare %JavaCommonClass* @getArrayClass(%JavaCommonClass*, 
                                          %JavaCommonClass**) readnone
 
+declare i8 @getFinalInt8Field(i8*) readnone
+declare i16 @getFinalInt16Field(i16*) readnone
+declare i32 @getFinalInt32Field(i32*) readnone
+declare i64 @getFinalLongField(i64*) readnone
+declare double @getFinalDoubleField(double*) readnone
+declare float @getFinalFloatField(float*) readnone
+declare %JavaObject* @getFinalObjectField(%JavaObject**) readnone
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exception methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=65324&r1=65323&r2=65324&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Mon Feb 23 11:18:28 2009
@@ -1696,8 +1696,43 @@
   JITVerifyNull(obj);
   
   Value* ptr = ldResolved(index, false, obj, type, LAI.llvmTypePtr);
+  
+  JnjvmBootstrapLoader* JBL = compilingClass->classLoader->bootstrapLoader;
+  bool final = false;
+  if (!compilingMethod->name->equals(JBL->initName)) {
+    JavaField* field = compilingClass->ctpInfo->lookupField(index, false);
+    if (field) final = isFinal(field->access);
+    if (final) {
+      Function* F = 0;
+      if (sign->isPrimitive()) {
+        const PrimitiveTypedef* prim = (PrimitiveTypedef*)sign;
+        if (prim->isInt()) {
+          F = module->GetFinalInt32FieldFunction;
+        } else if (prim->isByte()) {
+          F = module->GetFinalInt8FieldFunction;
+        } else if (prim->isBool()) {
+          F = module->GetFinalInt8FieldFunction;
+        } else if (prim->isShort()) {
+          F = module->GetFinalInt16FieldFunction;
+        } else if (prim->isChar()) {
+          F = module->GetFinalInt16FieldFunction;
+        } else if (prim->isLong()) {
+          F = module->GetFinalLongFieldFunction;
+        } else if (prim->isFloat()) {
+          F = module->GetFinalFloatFieldFunction;
+        } else if (prim->isDouble()) {
+          F = module->GetFinalDoubleFieldFunction;
+        } else {
+          abort();
+        }
+      } else {
+        F = module->GetFinalObjectFieldFunction;
+      }
+      push(CallInst::Create(F, ptr, "", currentBlock), sign->isUnsigned());
+    }
+  }
 
-  push(new LoadInst(ptr, "", currentBlock), sign->isUnsigned());
+  if (!final) push(new LoadInst(ptr, "", currentBlock), sign->isUnsigned());
   if (type == Type::Int64Ty || type == Type::DoubleTy) {
     push(module->constantZero, false);
   }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Feb 23 11:18:28 2009
@@ -2356,7 +2356,14 @@
   ThrowExceptionFunction = module->getFunction("JavaThreadThrowException");
 
   GetArrayClassFunction = module->getFunction("getArrayClass");
-  
+ 
+  GetFinalInt8FieldFunction = module->getFunction("getFinalInt8Field");
+  GetFinalInt16FieldFunction = module->getFunction("getFinalInt16Field");
+  GetFinalInt32FieldFunction = module->getFunction("getFinalInt32Field");
+  GetFinalLongFieldFunction = module->getFunction("getFinalLongField");
+  GetFinalFloatFieldFunction = module->getFunction("getFinalFloatField");
+  GetFinalDoubleFieldFunction = module->getFunction("getFinalDoubleField");
+  GetFinalObjectFieldFunction = module->getFunction("getFinalObjectField");
 
 #ifdef ISOLATE
   StringLookupFunction = module->getFunction("stringLookup");

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=65324&r1=65323&r2=65324&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Mon Feb 23 11:18:28 2009
@@ -362,6 +362,14 @@
 
   llvm::Function* GetLockFunction;
   llvm::Function* OverflowThinLockFunction;
+  
+  llvm::Function* GetFinalInt8FieldFunction;
+  llvm::Function* GetFinalInt16FieldFunction;
+  llvm::Function* GetFinalInt32FieldFunction;
+  llvm::Function* GetFinalLongFieldFunction;
+  llvm::Function* GetFinalFloatFieldFunction;
+  llvm::Function* GetFinalDoubleFieldFunction;
+  llvm::Function* GetFinalObjectFieldFunction;
 
   static llvm::ConstantInt* OffsetObjectSizeInClassConstant;
   static llvm::ConstantInt* OffsetVTInClassConstant;

Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=65324&r1=65323&r2=65324&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Mon Feb 23 11:18:28 2009
@@ -461,6 +461,18 @@
                    V == module->ForceLoadedCheckFunction ) {
           Changed = true;
           CI->eraseFromParent();
+        } else if (V == module->GetFinalInt8FieldFunction ||
+                   V == module->GetFinalInt16FieldFunction ||
+                   V == module->GetFinalInt32FieldFunction ||
+                   V == module->GetFinalLongFieldFunction ||
+                   V == module->GetFinalFloatFieldFunction ||
+                   V == module->GetFinalDoubleFieldFunction ||
+                   V == module->GetFinalObjectFieldFunction) {
+          Changed = true;
+          Value* val = Call.getArgument(0);
+          Value* res = new LoadInst(val, "", CI);
+          CI->replaceAllUsesWith(res);
+          CI->eraseFromParent();
         }
 #ifdef ISOLATE_SHARING
         else if (V == module->GetCtpClassFunction) {





More information about the vmkit-commits mailing list