1 /*
2  * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 
25 package org.graalvm.compiler.nodes;
26 
27 import org.graalvm.compiler.graph.Node;
28 import org.graalvm.compiler.graph.NodeClass;
29 import org.graalvm.compiler.graph.spi.Canonicalizable;
30 import org.graalvm.compiler.graph.spi.CanonicalizerTool;
31 import org.graalvm.compiler.nodeinfo.NodeInfo;
32 import org.graalvm.compiler.nodes.spi.LIRLowerable;
33 import org.graalvm.compiler.nodes.spi.Lowerable;
34 import org.graalvm.compiler.nodes.spi.LoweringTool;
35 import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
36 
37 import jdk.vm.ci.meta.JavaConstant;
38 import jdk.vm.ci.meta.MetaAccessProvider;
39 
40 @NodeInfo
41 public final class DynamicDeoptimizeNode extends AbstractDeoptimizeNode implements LIRLowerable, Lowerable, Canonicalizable {
42     public static final NodeClass<DynamicDeoptimizeNode> TYPE = NodeClass.create(DynamicDeoptimizeNode.class);
43     @Input ValueNode actionAndReason;
44     @Input ValueNode speculation;
45 
DynamicDeoptimizeNode(ValueNode actionAndReason, ValueNode speculation)46     public DynamicDeoptimizeNode(ValueNode actionAndReason, ValueNode speculation) {
47         super(TYPE, null);
48         this.actionAndReason = actionAndReason;
49         this.speculation = speculation;
50     }
51 
getActionAndReason()52     public ValueNode getActionAndReason() {
53         return actionAndReason;
54     }
55 
getSpeculation()56     public ValueNode getSpeculation() {
57         return speculation;
58     }
59 
60     @Override
getActionAndReason(MetaAccessProvider metaAccess)61     public ValueNode getActionAndReason(MetaAccessProvider metaAccess) {
62         return getActionAndReason();
63     }
64 
65     @Override
getSpeculation(MetaAccessProvider metaAccess)66     public ValueNode getSpeculation(MetaAccessProvider metaAccess) {
67         return getSpeculation();
68     }
69 
70     @Override
lower(LoweringTool tool)71     public void lower(LoweringTool tool) {
72         tool.getLowerer().lower(this, tool);
73     }
74 
75     @Override
generate(NodeLIRBuilderTool generator)76     public void generate(NodeLIRBuilderTool generator) {
77         generator.getLIRGeneratorTool().emitDeoptimize(generator.operand(actionAndReason), generator.operand(speculation), generator.state(this));
78     }
79 
80     @Override
canonical(CanonicalizerTool tool)81     public Node canonical(CanonicalizerTool tool) {
82         if (actionAndReason.isConstant() && speculation.isConstant()) {
83             JavaConstant constant = actionAndReason.asJavaConstant();
84             JavaConstant speculationConstant = speculation.asJavaConstant();
85             DeoptimizeNode newDeopt = new DeoptimizeNode(tool.getMetaAccess().decodeDeoptAction(constant), tool.getMetaAccess().decodeDeoptReason(constant), tool.getMetaAccess().decodeDebugId(
86                             constant), tool.getMetaAccess().decodeSpeculation(speculationConstant, graph().getSpeculationLog()), stateBefore());
87             return newDeopt;
88         }
89         return this;
90     }
91 }
92