20 * or visit www.oracle.com if you need additional information or have any |
20 * or visit www.oracle.com if you need additional information or have any |
21 * questions. |
21 * questions. |
22 */ |
22 */ |
23 package org.graalvm.compiler.phases.common.inlining.info; |
23 package org.graalvm.compiler.phases.common.inlining.info; |
24 |
24 |
25 import org.graalvm.compiler.core.common.calc.Condition; |
25 import org.graalvm.collections.EconomicSet; |
|
26 import org.graalvm.compiler.core.common.calc.CanonicalCondition; |
26 import org.graalvm.compiler.graph.Node; |
27 import org.graalvm.compiler.graph.Node; |
27 import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; |
28 import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; |
28 import org.graalvm.compiler.nodes.ConstantNode; |
29 import org.graalvm.compiler.nodes.ConstantNode; |
29 import org.graalvm.compiler.nodes.FixedGuardNode; |
30 import org.graalvm.compiler.nodes.FixedGuardNode; |
30 import org.graalvm.compiler.nodes.Invoke; |
31 import org.graalvm.compiler.nodes.Invoke; |
35 import org.graalvm.compiler.nodes.calc.CompareNode; |
36 import org.graalvm.compiler.nodes.calc.CompareNode; |
36 import org.graalvm.compiler.nodes.extended.LoadHubNode; |
37 import org.graalvm.compiler.nodes.extended.LoadHubNode; |
37 import org.graalvm.compiler.phases.common.inlining.InliningUtil; |
38 import org.graalvm.compiler.phases.common.inlining.InliningUtil; |
38 import org.graalvm.compiler.phases.common.inlining.info.elem.Inlineable; |
39 import org.graalvm.compiler.phases.common.inlining.info.elem.Inlineable; |
39 import org.graalvm.compiler.phases.util.Providers; |
40 import org.graalvm.compiler.phases.util.Providers; |
40 import org.graalvm.util.EconomicSet; |
|
41 |
41 |
42 import jdk.vm.ci.meta.DeoptimizationAction; |
42 import jdk.vm.ci.meta.DeoptimizationAction; |
43 import jdk.vm.ci.meta.DeoptimizationReason; |
43 import jdk.vm.ci.meta.DeoptimizationReason; |
44 import jdk.vm.ci.meta.ResolvedJavaMethod; |
44 import jdk.vm.ci.meta.ResolvedJavaMethod; |
45 import jdk.vm.ci.meta.ResolvedJavaType; |
45 import jdk.vm.ci.meta.ResolvedJavaType; |
112 private void createGuard(StructuredGraph graph, Providers providers) { |
112 private void createGuard(StructuredGraph graph, Providers providers) { |
113 ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke); |
113 ValueNode nonNullReceiver = InliningUtil.nonNullReceiver(invoke); |
114 LoadHubNode receiverHub = graph.unique(new LoadHubNode(providers.getStampProvider(), nonNullReceiver)); |
114 LoadHubNode receiverHub = graph.unique(new LoadHubNode(providers.getStampProvider(), nonNullReceiver)); |
115 ConstantNode typeHub = ConstantNode.forConstant(receiverHub.stamp(NodeView.DEFAULT), providers.getConstantReflection().asObjectHub(type), providers.getMetaAccess(), graph); |
115 ConstantNode typeHub = ConstantNode.forConstant(receiverHub.stamp(NodeView.DEFAULT), providers.getConstantReflection().asObjectHub(type), providers.getMetaAccess(), graph); |
116 |
116 |
117 LogicNode typeCheck = CompareNode.createCompareNode(graph, Condition.EQ, receiverHub, typeHub, providers.getConstantReflection(), NodeView.DEFAULT); |
117 LogicNode typeCheck = CompareNode.createCompareNode(graph, CanonicalCondition.EQ, receiverHub, typeHub, providers.getConstantReflection(), NodeView.DEFAULT); |
118 FixedGuardNode guard = graph.add(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile)); |
118 FixedGuardNode guard = graph.add(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile)); |
119 assert invoke.predecessor() != null; |
119 assert invoke.predecessor() != null; |
120 |
120 |
121 ValueNode anchoredReceiver = InliningUtil.createAnchoredReceiver(graph, guard, type, nonNullReceiver, true); |
121 ValueNode anchoredReceiver = InliningUtil.createAnchoredReceiver(graph, guard, type, nonNullReceiver, true); |
122 invoke.callTarget().replaceFirstInput(nonNullReceiver, anchoredReceiver); |
122 invoke.callTarget().replaceFirstInput(nonNullReceiver, anchoredReceiver); |