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/06/07 14:32:54 UTC
svn commit: r545155 - in /harmony/enhanced/drlvm/trunk:
src/test/regression/H2113/ src/test/regression/H2113/ExcInFinallyTest.j
src/test/regression/H2113/Test.java src/test/regression/H2113/run.test.xml
vm/jitrino/src/optimizer/FlowGraph.cpp
Author: varlax
Date: Thu Jun 7 05:32:53 2007
New Revision: 545155
URL: http://svn.apache.org/viewvc?view=rev&rev=545155
Log:
Applied HARMONY-2113 [drlvm][jit][opt] Jitrino.OPT loops infinitely in inlineJSR() when an exception from a subroutine (JSR->RET) is expected
Added:
harmony/enhanced/drlvm/trunk/src/test/regression/H2113/
harmony/enhanced/drlvm/trunk/src/test/regression/H2113/ExcInFinallyTest.j
harmony/enhanced/drlvm/trunk/src/test/regression/H2113/Test.java
harmony/enhanced/drlvm/trunk/src/test/regression/H2113/run.test.xml
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H2113/ExcInFinallyTest.j
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H2113/ExcInFinallyTest.j?view=auto&rev=545155
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H2113/ExcInFinallyTest.j (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H2113/ExcInFinallyTest.j Thu Jun 7 05:32:53 2007
@@ -0,0 +1,50 @@
+.class public org/apache/harmony/drlvm/tests/regression/H2113/ExcInFinallyTest
+.super java/lang/Object
+
+.method public <init>()V
+ aload_0
+ invokespecial java/lang/Object/<init>()V
+ return
+.end method
+
+.method public static test()V
+.limit stack 3
+.limit locals 6
+
+ bipush 1
+ newarray int
+ astore_1
+ iconst_0
+ istore_2
+ aload_1
+TryStart:
+ iload_2
+ iconst_0
+ iastore ; <-- use var2
+ goto EndSubroutine
+TryEnd1:
+ pop
+ jsr BeginSubroutine
+ goto ExitLabel
+BeginSubroutine: ; begin sub
+ astore 4
+ iconst_1
+ iconst_0
+ idiv ; <-- guaranteed exception here
+ istore_3
+ ret 4
+EndSubroutine: ; end sub
+ jsr BeginSubroutine
+ iinc 2 1 ; <-- use var2
+ goto ExitLabel
+TryEnd2:
+ pop
+ getstatic java.lang.System.out Ljava/io/PrintStream;
+ ldc "PASS"
+ invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
+ExitLabel:
+ return
+
+.catch all from TryStart to TryEnd1 using TryEnd1
+.catch all from TryStart to TryEnd2 using TryEnd2
+.end method
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H2113/Test.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H2113/Test.java?view=auto&rev=545155
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H2113/Test.java (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H2113/Test.java Thu Jun 7 05:32:53 2007
@@ -0,0 +1,23 @@
+package org.apache.harmony.drlvm.tests.regression.H2113;
+
+import junit.framework.TestCase;
+
+/**
+ * Loads class and tries to invoke a method which should fail
+ * verification.
+ *
+ * SubClass contains an incorrect invokespecial instruction which invokes
+ * a method from a subclass of the current class, while only superclass
+ * constructors can be called using this instruction.
+ */
+public class Test extends TestCase {
+ public static void main(String args[]) {
+ (new Test()).test();
+ }
+
+ public void test() {
+ ExcInFinallyTest.test();
+ }
+}
+
+
Added: harmony/enhanced/drlvm/trunk/src/test/regression/H2113/run.test.xml
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/src/test/regression/H2113/run.test.xml?view=auto&rev=545155
==============================================================================
--- harmony/enhanced/drlvm/trunk/src/test/regression/H2113/run.test.xml (added)
+++ harmony/enhanced/drlvm/trunk/src/test/regression/H2113/run.test.xml Thu Jun 7 05:32:53 2007
@@ -0,0 +1,9 @@
+<project name="RUN HARMONY-2113 Regression Test">
+ <target name="run-test">
+ <run-junit-test
+ test="org.apache.harmony.drlvm.tests.regression.H2113.Test"
+ vmarg="-Xem:opt">
+ </run-junit-test>
+ </target>
+</project>
+
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp?view=diff&rev=545155&r1=545154&r2=545155
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp Thu Jun 7 05:32:53 2007
@@ -523,7 +523,30 @@
//
// entryMap is a mapping [stVar -> ret inst]
//
- if(retVar == NULL || (entryMap.find(stVar) == entryMap.end())) {
+ // In some cases retNode exists, but is unreachable
+ // Let's check this
+ // if retNodeIsUnrichable==true
+ // then JSR never returns. Convert to jmp
+ bool retNodeIsUnreachable = true;
+ if (entryMap.find(stVar) != entryMap.end()) {
+ JsrEntryCIterRange jsr_range = entryMap.equal_range(stVar);
+ JsrEntryInstToRetInstMap::const_iterator i;
+ for(i = jsr_range.first; i != jsr_range.second; ++i) {
+ assert(i->first->getNode() == entryJSR);
+ Node* retNode = i->second->getNode();
+ UNUSED Inst* ret = (Inst*)retNode->getLastInst();
+ assert(ret->isRet());
+ assert(ret->getSrc(0) == retVar);
+
+ const Edges& inEdges = retNode->getInEdges();
+ if (!inEdges.empty()) {
+ retNodeIsUnreachable = false;
+ break;
+ }
+ }
+ }
+
+ if(retNodeIsUnreachable == true || retVar == NULL || (entryMap.find(stVar) == entryMap.end())) {
//
// JSR never returns. Convert to jmp.
//
@@ -845,6 +868,7 @@
fg.purgeUnreachableNodes();
inlineJSRs(&irm);
+ fg.purgeUnreachableNodes();
{
static CountTime cleanupPhaseInternalTimer("ptra::fg::cleanupPhase::in");