# HG changeset patch # User Lukas Stadler # Date 1403792856 -7200 # Node ID a762ddb12b437d90bb971166598f294e39958ccf # Parent aeaad00ddce0f05d2b23a6fbf28cb2e0888ba01a change some node types from Canonicalizable to Simplifiable diff -r aeaad00ddce0 -r a762ddb12b43 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java Thu Jun 26 16:27:35 2014 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/MethodHandleNode.java Thu Jun 26 16:27:36 2014 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2014, 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 @@ -38,12 +38,13 @@ import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; import com.oracle.graal.nodes.type.*; +import com.oracle.graal.nodes.util.*; import com.oracle.graal.replacements.nodes.*; /** * Node for invocation methods defined on the class {@link MethodHandle}. */ -public class MethodHandleNode extends MacroNode implements Canonicalizable { +public class MethodHandleNode extends MacroNode implements Simplifiable { /** The method that this node is representing. */ private final IntrinsicMethod intrinsicMethod; @@ -81,7 +82,7 @@ } @Override - public Node canonical(CanonicalizerTool tool) { + public void simplify(SimplifierTool tool) { InvokeNode invoke; switch (intrinsicMethod) { case INVOKE_BASIC: @@ -97,9 +98,11 @@ throw GraalInternalError.shouldNotReachHere(); } if (invoke != null) { - return invoke; + FixedNode next = next(); + replaceAtUsages(invoke); + GraphUtil.removeFixedWithUnusedInputs(this); + graph().addBeforeFixed(next, invoke); } - return this; } /** diff -r aeaad00ddce0 -r a762ddb12b43 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Thu Jun 26 16:27:35 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Thu Jun 26 16:27:36 2014 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2014, 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 @@ -39,7 +39,7 @@ /** * Implements a type check against a compile-time known type. */ -public class CheckCastNode extends FixedWithNextNode implements Canonicalizable, Lowerable, Virtualizable, ValueProxy { +public class CheckCastNode extends FixedWithNextNode implements Canonicalizable, Simplifiable, Lowerable, Virtualizable, ValueProxy { @Input private ValueNode object; private final ResolvedJavaType type; @@ -141,8 +141,6 @@ @Override public Node canonical(CanonicalizerTool tool) { - assert object() != null : this; - ResolvedJavaType objectType = StampTool.typeOrNull(object()); if (objectType != null && type.isAssignableFrom(objectType)) { // we don't have to check for null types here because they will also pass the @@ -150,6 +148,24 @@ return object(); } + if (StampTool.isObjectAlwaysNull(object())) { + return object(); + } + + if (tool.assumptions() != null && tool.assumptions().useOptimisticAssumptions()) { + ResolvedJavaType exactType = type.findUniqueConcreteSubtype(); + if (exactType != null && !exactType.equals(type)) { + // Propagate more precise type information to usages of the checkcast. + tool.assumptions().recordConcreteSubtype(type, exactType); + return new CheckCastNode(exactType, object, profile, forStoreCheck); + } + } + + return this; + } + + @Override + public void simplify(SimplifierTool tool) { // if the previous node is also a checkcast, with a less precise and compatible type, // replace both with one checkcast checking the more specific type. if (predecessor() instanceof CheckCastNode) { @@ -158,23 +174,10 @@ StructuredGraph graph = ccn.graph(); CheckCastNode newccn = graph.add(new CheckCastNode(type, ccn.object, ccn.profile, ccn.forStoreCheck)); graph.replaceFixedWithFixed(ccn, newccn); - return newccn; + replaceAtUsages(newccn); + graph.removeFixed(this); } } - - if (StampTool.isObjectAlwaysNull(object())) { - return object(); - } - if (tool.assumptions() != null && tool.assumptions().useOptimisticAssumptions()) { - ResolvedJavaType exactType = type.findUniqueConcreteSubtype(); - if (exactType != null && !exactType.equals(type)) { - // Propagate more precise type information to usages of the checkcast. - tool.assumptions().recordConcreteSubtype(type, exactType); - return graph().add(new CheckCastNode(exactType, object, profile, forStoreCheck)); - } - } - - return this; } public ValueNode object() { diff -r aeaad00ddce0 -r a762ddb12b43 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/UnsafeTypeCastMacroNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/UnsafeTypeCastMacroNode.java Thu Jun 26 16:27:35 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/UnsafeTypeCastMacroNode.java Thu Jun 26 16:27:36 2014 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2014, 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 @@ -25,17 +25,17 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.compiler.common.type.*; -import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.util.*; import com.oracle.graal.truffle.nodes.asserts.*; import com.oracle.truffle.api.*; /** * Macro node for method {@link CompilerDirectives#unsafeCast(Object, Class, boolean, boolean)}. */ -public class UnsafeTypeCastMacroNode extends NeverPartOfCompilationNode implements Canonicalizable { +public class UnsafeTypeCastMacroNode extends NeverPartOfCompilationNode implements Simplifiable { private static final int OBJECT_ARGUMENT_INDEX = 0; private static final int CLASS_ARGUMENT_INDEX = 1; @@ -49,22 +49,25 @@ } @Override - public Node canonical(CanonicalizerTool tool) { + public void simplify(SimplifierTool tool) { ValueNode classArgument = arguments.get(CLASS_ARGUMENT_INDEX); ValueNode nonNullArgument = arguments.get(NONNULL_ARGUMENT_INDEX); if (classArgument.isConstant() && nonNullArgument.isConstant()) { ValueNode objectArgument = arguments.get(OBJECT_ARGUMENT_INDEX); ValueNode conditionArgument = arguments.get(CONDITION_ARGUMENT_INDEX); ResolvedJavaType lookupJavaType = tool.getConstantReflection().asJavaType(classArgument.asConstant()); + tool.addToWorkList(usages()); if (lookupJavaType == null) { - return objectArgument; + replaceAtUsages(objectArgument); + GraphUtil.removeFixedWithUnusedInputs(this); + } else { + Stamp stamp = StampFactory.declared(lookupJavaType, nonNullArgument.asConstant().asInt() != 0); + ConditionAnchorNode valueAnchorNode = graph().add( + new ConditionAnchorNode(CompareNode.createCompareNode(graph(), Condition.EQ, conditionArgument, ConstantNode.forBoolean(true, graph())))); + PiNode piCast = graph().unique(new PiNode(objectArgument, stamp, valueAnchorNode)); + replaceAtUsages(piCast); + graph().replaceFixedWithFixed(this, valueAnchorNode); } - Stamp stamp = StampFactory.declared(lookupJavaType, nonNullArgument.asConstant().asInt() != 0); - ConditionAnchorNode valueAnchorNode = graph().add(new ConditionAnchorNode(CompareNode.createCompareNode(graph(), Condition.EQ, conditionArgument, ConstantNode.forBoolean(true, graph())))); - PiNode piCast = graph().unique(new PiNode(objectArgument, stamp, valueAnchorNode)); - this.replaceAtUsages(piCast); - return valueAnchorNode; } - return this; } }