You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/01/16 13:30:29 UTC

svn commit: r496669 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src: codegenerator/ia32/Ia32CodeLayout.cpp main/CompilationContext.cpp main/CompilationContext.h optimizer/inliner.cpp optimizer/inliner.h translator/java/JavaByteCodeTranslator.cpp

Author: varlax
Date: Tue Jan 16 04:30:28 2007
New Revision: 496669

URL: http://svn.apache.org/viewvc?view=rev&rev=496669
Log:
Applied HARMONY-2983 [drlvm][jit] Type propagation for args of inlined methods
Tested on SUSE9@ia32, SuSE9@x64

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32CodeLayout.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32CodeLayout.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32CodeLayout.cpp?view=diff&rev=496669&r1=496668&r2=496669
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32CodeLayout.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32CodeLayout.cpp Tue Jan 16 04:30:28 2007
@@ -131,11 +131,13 @@
 // Returns true if edge can be converted to a fall-through edge (i.e. an edge
 // not requiring a branch) assuming the edge's head block is laid out after the tail block. 
 bool Linearizer::canEdgeBeMadeToFallThrough(Edge *edge) {
+    Inst *inst = (Inst*)edge->getSourceNode()->getLastInst();
+    if (edge->isUnconditionalEdge()) {
+        return inst == NULL || !inst->hasKind(Inst::Kind_SwitchInst);
+    }
     assert(edge->isTrueEdge());
-    Inst *br = (Inst*)edge->getSourceNode()->getLastInst();
-    assert(br!=NULL);
-    assert(br->hasKind(Inst::Kind_BranchInst));
-    return ((BranchInst*)br)->canReverse();
+    assert(inst->hasKind(Inst::Kind_BranchInst));
+    return ((BranchInst*)inst)->canReverse();
 }
 
 bool Linearizer::isBlockLayoutDone() {

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.cpp?view=diff&rev=496669&r1=496668&r2=496669
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.cpp Tue Jan 16 04:30:28 2007
@@ -59,7 +59,7 @@
 #endif
     currentSessionAction = NULL;
     currentSessionNum = 0;
-
+    inliningContext = NULL;
     ccTls.push((CompilationContext*)this);
 }
 

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.h?view=diff&rev=496669&r1=496668&r2=496669
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/CompilationContext.h Tue Jan 16 04:30:28 2007
@@ -32,6 +32,7 @@
 class SessionAction;
 class LogStreams;
 class HPipeline;
+class InliningContext;
 
 #ifdef _IPF_
 #else 
@@ -78,6 +79,9 @@
     void setPipeline(HPipeline* pipe) {pipeline = pipe;}
     HPipeline* getPipeline () const {return pipeline;}
 
+    void setInliningContext(InliningContext* c) {inliningContext = c;}
+    InliningContext* getInliningContext() const {return inliningContext;}
+
     static CompilationContext* getCurrentContext();
 
 #ifdef _IPF_
@@ -102,6 +106,7 @@
     int                     currentSessionNum;
     LogStreams*             currentLogStreams;
     HPipeline*              pipeline;
+    InliningContext*        inliningContext;
 
     void init();
     void initCompilationMode();

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp?view=diff&rev=496669&r1=496668&r2=496669
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp Tue Jan 16 04:30:28 2007
@@ -969,6 +969,16 @@
     }
 
     inlineCC.setHIRManager(inlinedIRM);
+    
+    //prepare type info
+    uint32 nArgs = call->getNumSrcOperands() - 2;
+    Type** types = new (_tmpMM)Type*[nArgs];
+    for (uint32 i = 0; i < nArgs; i++) {
+        types[i] = call->getSrc(i + 2)->getType();
+    }
+
+    InliningContext* ic = new (_tmpMM) InliningContext(nArgs, types);
+    inlineCC.setInliningContext(ic);
     runTranslatorSession(inlineCC);
 
     return inlineNode;

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h?view=diff&rev=496669&r1=496668&r2=496669
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h Tue Jan 16 04:30:28 2007
@@ -47,6 +47,16 @@
 class LoopTree;
 class Method_Table;
 
+class InliningContext {
+public:
+    InliningContext(uint32 _nArgs, Type** _argTypes) : nArgs(_nArgs), argTypes(_argTypes) {}
+    uint32 getNumArgs() const {return nArgs;}
+    Type** getArgTypes() const {return argTypes;}
+private:
+    uint32 nArgs;
+    Type** argTypes;
+};
+
 class InlineNode : public TreeNode {
 public:
     InlineNode(IRManager& irm, Inst *callInst, Node *callNode) : _irm(irm), _callInst(callInst), _callNode(callNode) {}

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp?view=diff&rev=496669&r1=496668&r2=496669
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Tue Jan 16 04:30:28 2007
@@ -32,6 +32,7 @@
 #include "irmanager.h"
 #include "Jitrino.h"
 #include "EMInterface.h"
+#include "inliner.h"
 
 #include <assert.h>
 #include <stdio.h>
@@ -236,6 +237,8 @@
     cfgBuilder.genBlock(irBuilder.genMethodEntryLabel(&methodDesc));
     initLocalVars();
     initArgs();
+    CompilationContext* cc = CompilationContext::getCurrentContext();
+    InliningContext* ic  = cc->getInliningContext();
     //
     // load actual parameters into formal parameters
     //
@@ -251,6 +254,16 @@
             arg = irBuilder.genArgDef(NonNullThisArg,argTypes[i]);
         } else {
             Type* type = argTypes[i];
+            if (ic!=NULL) {
+                assert(ic->getNumArgs() == numArgs);
+                Type* newType = ic->getArgTypes()[i];
+                if (newType->isObject()) {
+                    assert(newType->isNullObject() || newType->asObjectType()->isSubClassOf(type->asObjectType()));
+                    type = newType;
+                } else {
+                    //do nothing, numX->numY auto convertion not tested
+                }
+            } 
             if (isMagicClass(type)) {
                 type = convertMagicType2HIR(typeManager, type);
             }