Mercurial > hg > truffle
changeset 8906:0727a91b3293
Merge
author | Christos Kotselidis <christos.kotselidis@oracle.com> |
---|---|
date | Mon, 08 Apr 2013 21:30:56 +0200 |
parents | c502db57e687 (current diff) 59e751e68bea (diff) |
children | 91c39d0927fb |
files | graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/PushNodesThroughPi.java |
diffstat | 11 files changed, 97 insertions(+), 67 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.api.replacements/src/com/oracle/graal/api/replacements/MethodSubstitution.java Mon Apr 08 21:17:34 2013 +0200 +++ b/graal/com.oracle.graal.api.replacements/src/com/oracle/graal/api/replacements/MethodSubstitution.java Mon Apr 08 21:30:56 2013 +0200 @@ -54,4 +54,11 @@ * is the same as the substitute method. */ String signature() default ""; + + /** + * Determines if the substitution is for a method that may not be part of the runtime. For + * example, a method introduced in a later JDK version. Substitutions for such methods are + * omitted if the original method cannot be found. + */ + boolean optional() default false; }
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java Mon Apr 08 21:17:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/PushNodesThroughPiTest.java Mon Apr 08 21:30:56 2013 +0200 @@ -84,7 +84,7 @@ StructuredGraph graph = parse(snippet); new LoweringPhase(null, runtime(), replacements, new Assumptions(false)).apply(graph); new CanonicalizerPhase(runtime(), null).apply(graph); - new PushNodesThroughPi().apply(graph); + new PushThroughPiPhase().apply(graph); new CanonicalizerPhase(runtime(), null).apply(graph); return graph;
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Mon Apr 08 21:17:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Mon Apr 08 21:30:56 2013 +0200 @@ -180,7 +180,7 @@ new LoweringPhase(target, runtime, replacements, assumptions).apply(graph); if (GraalOptions.OptPushThroughPi) { - new PushNodesThroughPi().apply(graph); + new PushThroughPiPhase().apply(graph); if (GraalOptions.OptCanonicalizer) { new CanonicalizerPhase(runtime, assumptions).apply(graph); }
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Mon Apr 08 21:17:34 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Mon Apr 08 21:30:56 2013 +0200 @@ -225,6 +225,13 @@ return stateFor(deopt.getDeoptimizationState(), deopt.getDeoptimizationReason()); } + public LIRFrameState stateWithExceptionEdge(DeoptimizingNode deopt, LabelRef exceptionEdge) { + if (!deopt.canDeoptimize()) { + return null; + } + return stateForWithExceptionEdge(deopt.getDeoptimizationState(), deopt.getDeoptimizationReason(), exceptionEdge); + } + public LIRFrameState stateFor(FrameState state, DeoptimizationReason reason) { return stateForWithExceptionEdge(state, reason, null); } @@ -233,6 +240,7 @@ if (needOnlyOopMaps()) { return new LIRFrameState(null, null, null, (short) -1); } + assert state != null; return debugInfoBuilder.build(state, lir.getDeoptimizationReasons().addSpeculation(reason), exceptionEdge); } @@ -603,13 +611,13 @@ Value[] parameters = visitInvokeArguments(cc, callTarget.arguments()); - LIRFrameState callState = null; - if (x.stateAfter() != null) { - callState = stateForWithExceptionEdge(x.stateDuring(), null, x instanceof InvokeWithExceptionNode ? getLIRBlock(((InvokeWithExceptionNode) x).exceptionEdge()) : null); + LabelRef exceptionEdge = null; + if (x instanceof InvokeWithExceptionNode) { + exceptionEdge = getLIRBlock(((InvokeWithExceptionNode) x).exceptionEdge()); } + LIRFrameState callState = stateWithExceptionEdge(x, exceptionEdge); Value result = cc.getReturn(); - if (callTarget instanceof DirectCallTargetNode) { emitDirectCall((DirectCallTargetNode) callTarget, result, parameters, cc.getTemporaries(), callState); } else if (callTarget instanceof IndirectCallTargetNode) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java Mon Apr 08 21:17:34 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java Mon Apr 08 21:30:56 2013 +0200 @@ -91,7 +91,10 @@ } result = memory.toObject(); } - return unsafeCast(verifyOop(result), StampFactory.forNodeIntrinsic()); + /* make sure that the unsafeCast is anchored after initialization, + * see ReadAfterCheckCast and CheckCastSnippets */ + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + return unsafeCast(verifyOop(result), StampFactory.forNodeIntrinsic(), anchorNode); } @Snippet @@ -122,7 +125,8 @@ formatArray(hub, allocationSize, length, headerSize, memory, prototypeMarkWord, fillContents); result = memory.toObject(); } - return unsafeArrayCast(verifyOop(result), length, StampFactory.forNodeIntrinsic()); + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + return unsafeArrayCast(verifyOop(result), length, StampFactory.forNodeIntrinsic(), anchorNode); } /**
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeArrayCastNode.java Mon Apr 08 21:17:34 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeArrayCastNode.java Mon Apr 08 21:30:56 2013 +0200 @@ -37,8 +37,8 @@ return length; } - public UnsafeArrayCastNode(ValueNode object, ValueNode length, Stamp stamp) { - super(object, stamp); + public UnsafeArrayCastNode(ValueNode object, ValueNode length, Stamp stamp, ValueNode anchor) { + super(object, stamp, anchor); this.length = length; } @@ -51,5 +51,5 @@ } @NodeIntrinsic - public static native <T> T unsafeArrayCast(Object object, int length, @ConstantNodeParameter Stamp stamp); + public static native <T> T unsafeArrayCast(Object object, int length, @ConstantNodeParameter Stamp stamp, ValueNode anchor); }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/MacroSubstitution.java Mon Apr 08 21:17:34 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/MacroSubstitution.java Mon Apr 08 21:30:56 2013 +0200 @@ -61,6 +61,13 @@ String signature() default ""; /** + * Determines if the substitution is for a method that may not be part of the runtime. For + * example, a method introduced in a later JDK version. Substitutions for such methods are + * omitted if the original method cannot be found. + */ + boolean optional() default false; + + /** * The node class with which the method invocation should be replaced. It needs to be a subclass * of {@link FixedWithNextNode}, and it is expected to provide a public constructor that takes * an {@link InvokeNode} as a parameter.
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/PushNodesThroughPi.java Mon Apr 08 21:17:34 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.graal.phases.common; - -import com.oracle.graal.debug.*; -import com.oracle.graal.graph.*; -import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.phases.*; - -public class PushNodesThroughPi extends Phase { - - public static final DebugMetric PUSHED_NODES = Debug.metric("NodesPushedThroughPi"); - - @Override - protected void run(StructuredGraph graph) { - for (PiNode pi : graph.getNodes(PiNode.class)) { - for (Node n : pi.usages().snapshot()) { - if (n instanceof PiPushable) { - PiPushable pip = (PiPushable) n; - if (pip.push(pi)) { - PUSHED_NODES.add(1); - } - } - } - } - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/PushThroughPiPhase.java Mon Apr 08 21:30:56 2013 +0200 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.phases.common; + +import com.oracle.graal.debug.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.phases.*; + +public class PushThroughPiPhase extends Phase { + + public static final DebugMetric PUSHED_NODES = Debug.metric("NodesPushedThroughPi"); + + @Override + protected void run(StructuredGraph graph) { + for (PiNode pi : graph.getNodes(PiNode.class)) { + for (Node n : pi.usages().snapshot()) { + if (n instanceof PiPushable) { + PiPushable pip = (PiPushable) n; + if (pip.push(pi)) { + PUSHED_NODES.add(1); + } + } + } + } + } +}
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Mon Apr 08 21:17:34 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Mon Apr 08 21:30:56 2013 +0200 @@ -147,7 +147,7 @@ } String originalName = originalName(substituteMethod, methodSubstitution.value()); Class[] originalParameters = originalParameters(substituteMethod, methodSubstitution.signature(), methodSubstitution.isStatic()); - Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); + Member originalMethod = originalMethod(classSubstitution, methodSubstitution.optional(), originalName, originalParameters); if (originalMethod != null) { registerMethodSubstitution(originalMethod, substituteMethod); } @@ -155,7 +155,7 @@ if (macroSubstitution != null) { String originalName = originalName(substituteMethod, macroSubstitution.value()); Class[] originalParameters = originalParameters(substituteMethod, macroSubstitution.signature(), macroSubstitution.isStatic()); - Member originalMethod = originalMethod(classSubstitution, originalName, originalParameters); + Member originalMethod = originalMethod(classSubstitution, macroSubstitution.optional(), originalName, originalParameters); if (originalMethod != null) { registerMacroSubstitution(originalMethod, macroSubstitution.macro()); } @@ -448,7 +448,7 @@ return parameters; } - private static Member originalMethod(ClassSubstitution classSubstitution, String name, Class[] parameters) { + private static Member originalMethod(ClassSubstitution classSubstitution, boolean optional, String name, Class[] parameters) { Class<?> originalClass = classSubstitution.value(); if (originalClass == ClassSubstitution.class) { originalClass = resolveType(classSubstitution.className(), classSubstitution.optional()); @@ -464,6 +464,9 @@ return originalClass.getDeclaredMethod(name, parameters); } } catch (NoSuchMethodException | SecurityException e) { + if (optional) { + return null; + } throw new GraalInternalError(e); } }
--- a/mx/commands.py Mon Apr 08 21:17:34 2013 +0200 +++ b/mx/commands.py Mon Apr 08 21:30:56 2013 +0200 @@ -66,8 +66,9 @@ """clean the GraalVM source tree""" opts = mx.clean(args, parser=ArgumentParser(prog='mx clean')) if opts.native: - os.environ.update(ARCH_DATA_MODEL='64', LANG='C', HOTSPOT_BUILD_JOBS='16') - mx.run([mx.gmake_cmd(), 'clean'], cwd=join(_graal_home, 'make')) + env = os.environ.copy() + env.update(ARCH_DATA_MODEL='64', LANG='C', HOTSPOT_BUILD_JOBS='16') + mx.run([mx.gmake_cmd(), 'clean'], cwd=join(_graal_home, 'make'), env=env) jdks = join(_graal_home, 'jdk' + str(mx.java().version)) if exists(jdks): shutil.rmtree(jdks) @@ -657,8 +658,8 @@ if not exists(jvmCfg): mx.abort(jvmCfg + ' does not exist') - prefix = '-' + vm - vmKnown = prefix + ' KNOWN\n' + prefix = '-' + vm + ' ' + vmKnown = prefix + 'KNOWN\n' lines = [] found = False with open(jvmCfg) as f: @@ -668,7 +669,7 @@ lines.append(line) if not found: - mx.log('Appending "' + prefix + ' KNOWN" to ' + jvmCfg) + mx.log('Appending "' + prefix + 'KNOWN" to ' + jvmCfg) if mx.get_os() != 'windows': os.chmod(jvmCfg, 0755) with open(jvmCfg, 'w') as f: