Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 49631 invoked from network); 16 Jan 2007 12:31:37 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 16 Jan 2007 12:31:37 -0000 Received: (qmail 23064 invoked by uid 500); 16 Jan 2007 12:31:40 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 23046 invoked by uid 500); 16 Jan 2007 12:31:40 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 23026 invoked by uid 99); 16 Jan 2007 12:31:40 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 16 Jan 2007 04:31:40 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 16 Jan 2007 04:31:33 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id 3E06A1A981A; Tue, 16 Jan 2007 04:30:30 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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 Date: Tue, 16 Jan 2007 12:30:29 -0000 To: commits@harmony.apache.org From: varlax@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070116123030.3E06A1A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 #include @@ -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); }