# HG changeset patch # User Thomas Wuerthinger # Date 1330110332 -3600 # Node ID b22f3f406b978b19a54802d76ea9901eed3352bf # Parent 15849962252df3e8a67d3d5facb749b4bb971e23# Parent dd521d4817343811aa46f53d8fe3924977b27ea8 Merge. diff -r 15849962252d -r b22f3f406b97 .hgignore --- 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/ diff -r 15849962252d -r b22f3f406b97 graal/com.oracle.max.graal.alloc/src/com/oracle/max/graal/alloc/util/RegisterVerifier.java --- 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); diff -r 15849962252d -r b22f3f406b97 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java --- 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 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 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); + } + } } diff -r 15849962252d -r b22f3f406b97 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/SchedulePhase.java --- 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; } diff -r 15849962252d -r b22f3f406b97 graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/Bytecodes.java --- 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"; diff -r 15849962252d -r b22f3f406b97 graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/GraphBuilderPhase.java --- 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 { diff -r 15849962252d -r b22f3f406b97 mx/commands.py --- 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 diff -r 15849962252d -r b22f3f406b97 mx/projects --- 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 diff -r 15849962252d -r b22f3f406b97 src/share/vm/runtime/frame.cpp --- 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