changeset 4690:b22f3f406b97

Merge.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Fri, 24 Feb 2012 20:05:32 +0100
parents 15849962252d (current diff) dd521d481734 (diff)
children fc42b5b6941a
files graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java
diffstat 9 files changed, 96 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Fri Feb 24 19:52:27 2012 +0100
+++ b/.hgignore	Fri Feb 24 20:05:32 2012 +0100
@@ -23,6 +23,8 @@
 \.pdf$
 \.dot$
 \.pyc$
+\.hprof$
+\.hprof\.txt$
 ^graal/.*/build.xml
 ^graal/.*/nbproject/
 dist
@@ -32,7 +34,6 @@
 output\.txt$
 output\.cfg$
 \.cfg
-java\.hprof\.txt$
 /nbproject/private/
 ^graal/hotspot/java$
 ^scratch/
--- a/graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java	Fri Feb 24 19:52:27 2012 +0100
+++ b/graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java	Fri Feb 24 20:05:32 2012 +0100
@@ -145,7 +145,7 @@
                 if (savedValue != inputValue) {
                     // Current inputState and previous savedState assume a different value in this register.
                     // Assume that this register is invalid and remove it from the saved state.
-                    Debug.log("    invalididating %s because it is inconsistent with %s", savedValue, inputValue);
+                    Debug.log("    invalidating %s because it is inconsistent with %s", savedValue, inputValue);
                     iter.remove();
                     // Must re-visit this block.
                     addToWorkList(succ);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java	Fri Feb 24 19:52:27 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java	Fri Feb 24 20:05:32 2012 +0100
@@ -24,8 +24,10 @@
 
 import java.util.*;
 
+import com.oracle.max.graal.debug.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.nodes.*;
+import com.oracle.max.graal.nodes.util.*;
 
 public class ConvertDeoptimizeToGuardPhase extends Phase {
 
@@ -42,32 +44,48 @@
 
     @Override
     protected void run(final StructuredGraph graph) {
-        List<DeoptimizeNode> nodes = graph.getNodes(DeoptimizeNode.class).snapshot();
-        if (nodes.size() == 0) {
+        if (graph.getNodes(DeoptimizeNode.class).isEmpty()) {
             return;
         }
 
-        for (DeoptimizeNode d : nodes) {
-            BeginNode myBeginNode = findBeginNode(d);
-            Node controlSplit = myBeginNode.predecessor();
-
-            if (controlSplit instanceof IfNode) {
-                IfNode ifNode = (IfNode) controlSplit;
-                BeginNode otherBegin = ifNode.trueSuccessor();
-                BooleanNode conditionNode = ifNode.compare();
-                if (myBeginNode == ifNode.trueSuccessor()) {
-                    conditionNode = conditionNode.negate();
-                    otherBegin = ifNode.falseSuccessor();
-                }
-                BeginNode ifBlockBegin = findBeginNode(ifNode);
-                graph.unique(new GuardNode(conditionNode, ifBlockBegin));
-                otherBegin.replaceAtUsages(ifBlockBegin);
-                FixedNode next = otherBegin.next();
-                otherBegin.setNext(null);
-                ifNode.replaceAtPredecessors(next);
-            }
+        for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.class)) {
+            visitDeoptBranch(findBeginNode(d), d, graph);
         }
 
         new DeadCodeEliminationPhase().apply(graph);
     }
+
+    private void visitDeoptBranch(BeginNode deoptBegin, DeoptimizeNode deopt, StructuredGraph graph) {
+        if (deoptBegin instanceof MergeNode) {
+            MergeNode mergeNode = (MergeNode) deoptBegin;
+            Debug.log("Eliminating %s followed by %s", mergeNode, deopt);
+            List<EndNode> ends = mergeNode.forwardEnds().snapshot();
+            for (EndNode end : ends) {
+                if (!end.isDeleted()) {
+                    BeginNode beginNode = findBeginNode(end);
+                    visitDeoptBranch(beginNode, deopt, graph);
+                }
+            }
+            if (!deopt.isDeleted()) {
+                visitDeoptBranch(findBeginNode(deopt), deopt, graph);
+            }
+        } else if (deoptBegin.predecessor() instanceof IfNode) {
+            IfNode ifNode = (IfNode) deoptBegin.predecessor();
+            BeginNode otherBegin = ifNode.trueSuccessor();
+            BooleanNode conditionNode = ifNode.compare();
+            if (deoptBegin == ifNode.trueSuccessor()) {
+                conditionNode = conditionNode.negate();
+                otherBegin = ifNode.falseSuccessor();
+            }
+            BeginNode ifBlockBegin = findBeginNode(ifNode);
+            Debug.log("Converting %s on %-5s branch of %s to guard for remaining branch %s. IfBegin=%s", deopt, deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin, ifBlockBegin);
+            FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode));
+            otherBegin.replaceAtUsages(ifBlockBegin);
+            FixedNode next = otherBegin.next();
+            otherBegin.setNext(null);
+            guard.setNext(next);
+            ifNode.replaceAtPredecessors(guard);
+            GraphUtil.killCFG(ifNode);
+        }
+    }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java	Fri Feb 24 19:52:27 2012 +0100
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java	Fri Feb 24 20:05:32 2012 +0100
@@ -116,7 +116,7 @@
         } else if (GraalOptions.ScheduleOutOfLoops && !(n instanceof VirtualObjectFieldNode) && !(n instanceof VirtualObjectNode)) {
             Block earliestBlock = earliestBlock(n);
             block = scheduleOutOfLoops(n, latestBlock, earliestBlock);
-            assert earliestBlock.dominates(block) : "Graph can not be scheduled : inconsisitant for " + n;
+            assert earliestBlock.dominates(block) : "Graph can not be scheduled : inconsistent for " + n;
         } else {
             block = latestBlock;
         }
--- a/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/Bytecodes.java	Fri Feb 24 19:52:27 2012 +0100
+++ b/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/Bytecodes.java	Fri Feb 24 20:05:32 2012 +0100
@@ -328,8 +328,8 @@
         try {
             for (Field field : Flags.class.getDeclaredFields()) {
                 int flagsFilter = Modifier.FINAL | Modifier.STATIC;
-                if ((field.getModifiers() & flagsFilter) == flagsFilter) {
-                    assert field.getType() == int.class : "Only " + field;
+                if ((field.getModifiers() & flagsFilter) == flagsFilter && !field.isSynthetic()) {
+                    assert field.getType() == int.class : "Field is not int : " + field;
                     final int flag = field.getInt(null);
                     assert flag != 0;
                     assert (flag & allFlags) == 0 : field.getName() + " has a value conflicting with another flag";
--- a/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java	Fri Feb 24 19:52:27 2012 +0100
+++ b/graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java	Fri Feb 24 20:05:32 2012 +0100
@@ -732,12 +732,8 @@
             AnchorNode anchor = currentGraph.add(new AnchorNode());
             append(anchor);
             CheckCastNode checkCast;
-            if (type instanceof RiResolvedType) {
-                RiResolvedType[] hints = getTypeCheckHints((RiResolvedType) type, 2);
-                checkCast = currentGraph.unique(new CheckCastNode(anchor, typeInstruction, (RiResolvedType) type, object, hints, Util.isFinalClass((RiResolvedType) type)));
-            } else {
-                checkCast = currentGraph.unique(new CheckCastNode(anchor, typeInstruction, (RiResolvedType) type, object));
-            }
+            RiResolvedType[] hints = getTypeCheckHints((RiResolvedType) type, 2);
+            checkCast = currentGraph.unique(new CheckCastNode(anchor, typeInstruction, (RiResolvedType) type, object, hints, Util.isFinalClass((RiResolvedType) type)));
             append(currentGraph.add(new ValueAnchorNode(checkCast)));
             frameState.apush(checkCast);
         } else {
--- a/mx/commands.py	Fri Feb 24 19:52:27 2012 +0100
+++ b/mx/commands.py	Fri Feb 24 20:05:32 2012 +0100
@@ -46,6 +46,16 @@
     This can be set via the global '--fastdebug' and '--debug' options. """
 _vmbuild = 'product'
 
+_jacoco = False
+
+_jacocoExcludes = ['com.oracle.max.graal.hotspot.snippets.ArrayCopySnippets',
+                   'com.oracle.max.graal.snippets.DoubleSnippets',
+                   'com.oracle.max.graal.snippets.FloatSnippets',
+                   'com.oracle.max.graal.snippets.MathSnippetsX86',
+                   'com.oracle.max.graal.snippets.NodeClassSnippets',
+                   'com.oracle.max.graal.hotspot.snippets.SystemSnippets',
+                   'com.oracle.max.graal.hotspot.snippets.UnsafeSnippets']
+
 _copyrightTemplate = """/*
  * Copyright (c) {0}, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -475,6 +485,15 @@
     mx.expand_project_in_args(args)  
     if mx.java().debug:
         args = ['-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000'] + args
+    if _jacoco:
+        jacocoagent = mx.library("JACOCOAGENT", True)
+        agentOptions = {
+                        'append' : 'false',
+                        'bootclasspath' : 'true',
+                        'includes' : 'com.oracle.max.*',
+                        'excludes' : ':'.join(_jacocoExcludes)
+        }
+        args = ['-javaagent:' + jacocoagent.get_path(True) + '=' + ','.join([k + '=' + v for k, v in agentOptions.items()])] + args
     exe = join(_jdk(build), 'bin', mx.exe_suffix('java'))
     return mx.run([exe, '-' + vm] + args, nonZeroIsFatal=nonZeroIsFatal, out=out, err=err, cwd=cwd, timeout=timeout)
 
@@ -679,9 +698,9 @@
             unittest([])
             tasks.append(t.stop())
             
-            # t = Task('JavaTesterTests:' + vmbuild)
-            # jtt([])
-            # tasks.append(t.stop())
+            t = Task('JavaTesterTests:' + vmbuild)
+            jtt([])
+            tasks.append(t.stop())
             
             for test in sanitycheck.getDacapos(level=sanitycheck.SanityCheckLevel.Gate, gateBuildLevel=vmbuild):
                 t = Task(str(test) + ':' + vmbuild)
@@ -810,6 +829,19 @@
     path = join(_vmLibDirInJdk(_jdk(build)), lib)
     mx.download(path, ['http://lafo.ssw.uni-linz.ac.at/hsdis/' + flavor + "/" + lib])
     
+def jacocoreport(args):
+    """creates a JaCoCo coverage report
+
+    Creates the report from the 'jacoco.exec' file in the current directory.
+    Default output directory is 'coverage', but an alternative can be provided as an argument."""
+    jacocoreport = mx.library("JACOCOREPORT", True)
+    out = 'coverage'
+    if len(args) == 1:
+        out = args[0]
+    elif len(args) > 1:
+        mx.abort('jacocoreport takes only one argument : an output directory')
+    mx.run_java(['-jar', jacocoreport.get_path(True), '-in', 'jacoco.exec', '-g', join(_graal_home, 'graal'), out])
+    
 def mx_init():
     _vmbuild = 'product'
     commands = {
@@ -827,8 +859,11 @@
         'bench' : [bench, '[-resultfile file] [all(default)|dacapo|specjvm2008|bootstrap]'],
         'unittest' : [unittest, '[filters...]'],
         'jtt' : [jtt, '[filters...]'],
+        'jacocoreport' : [jacocoreport, '[output directory]'],
         'vm': [vm, '[-options] class [args...]']
     }
+    
+    mx.add_argument('--jacoco', action='store_true', dest='jacoco', help='instruments com.oracle.max.* classes using JaCoCo')
 
     if (_vmSourcesAvailable):
         mx.add_argument('--vm', action='store', dest='vm', default='graal', choices=['graal', 'server', 'client'], help='the VM to build/run (default: graal)')
@@ -859,3 +894,6 @@
         if hasattr(opts, 'vmbuild') and opts.vmbuild is not None:
             global _vmbuild
             _vmbuild = opts.vmbuild
+    if opts.jacoco:
+        global _jacoco
+        _jacoco = True
--- a/mx/projects	Fri Feb 24 19:52:27 2012 +0100
+++ b/mx/projects	Fri Feb 24 20:05:32 2012 +0100
@@ -41,6 +41,12 @@
 library@DACAPO@path=lib/dacapo-9.12-bach.jar
 library@DACAPO@urls=http://dfn.dl.sourceforge.net/project/dacapobench/9.12-bach/dacapo-9.12-bach.jar
 
+library@JACOCOAGENT@path=lib/jacocoagent.jar
+library@JACOCOAGENT@urls=http://lafo.ssw.uni-linz.ac.at/jacoco/jacocoagent.jar
+
+library@JACOCOREPORT@path=lib/jacocoreport.jar
+library@JACOCOREPORT@urls=http://lafo.ssw.uni-linz.ac.at/jacoco/jacocoreport.jar
+
 library@DACAPO_SCALA@path=lib/dacapo-scala-0.1.0.jar
 library@DACAPO_SCALA@urls=http://repo.scalabench.org/snapshots/org/scalabench/benchmarks/scala-benchmark-suite/0.1.0-SNAPSHOT/scala-benchmark-suite-0.1.0-20110908.085753-2.jar
 
--- a/src/share/vm/runtime/frame.cpp	Fri Feb 24 19:52:27 2012 +0100
+++ b/src/share/vm/runtime/frame.cpp	Fri Feb 24 20:05:32 2012 +0100
@@ -604,6 +604,7 @@
 void frame::interpreter_frame_print_on(outputStream* st) const {
 #ifndef PRODUCT
   assert(is_interpreted_frame(), "Not an interpreted frame");
+  assert(interpreter_frame_method() != NULL && interpreter_frame_method()->contains(interpreter_frame_bcp()), "must be");
   jint i;
   st->print_cr(" - sp                                  = " INTPTR_FORMAT, sp());
   // expressions
@@ -630,7 +631,7 @@
   // bcp/bcx
   st->print   (" - bcp           at " INTPTR_FORMAT " = " INTPTR_FORMAT, interpreter_frame_bcx_addr(), interpreter_frame_bcp());
   st->fill_to(70);
-  st->print_cr("; @%d", interpreter_frame_bci());
+  st->print_cr("; @%d - %s", interpreter_frame_bci(), Bytecodes::name(interpreter_frame_method()->code_at(interpreter_frame_bci())));
   // locals
   st->print_cr(" - locals        at " INTPTR_FORMAT " = " INTPTR_FORMAT, interpreter_frame_locals_addr(), *interpreter_frame_locals_addr());
   // constant pool cache