src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConvertDeoptimizeToGuardPhase.java
author iveresov
Fri, 02 Feb 2018 17:28:17 -0800
changeset 48861 47f19ff9903c
parent 47216 71c04702a3d5
child 49451 e06f9607f370
permissions -rw-r--r--
8194819: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     1
/*
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
     2
 * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     4
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     8
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    13
 * accompanied this code).
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    14
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    18
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    21
 * questions.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    22
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    23
package org.graalvm.compiler.phases.common;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    24
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    25
import static org.graalvm.compiler.phases.common.DeadCodeEliminationPhase.Optionality.Optional;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    27
import java.util.List;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    28
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    29
import org.graalvm.compiler.core.common.GraalOptions;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    30
import org.graalvm.compiler.debug.DebugCloseable;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    31
import org.graalvm.compiler.graph.Node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    32
import org.graalvm.compiler.graph.spi.SimplifierTool;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    33
import org.graalvm.compiler.nodeinfo.InputType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    34
import org.graalvm.compiler.nodes.AbstractBeginNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
import org.graalvm.compiler.nodes.AbstractEndNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    36
import org.graalvm.compiler.nodes.AbstractMergeNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    37
import org.graalvm.compiler.nodes.ConstantNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    38
import org.graalvm.compiler.nodes.ControlSplitNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
import org.graalvm.compiler.nodes.DeoptimizeNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    40
import org.graalvm.compiler.nodes.EndNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
import org.graalvm.compiler.nodes.FixedGuardNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.nodes.FixedNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
import org.graalvm.compiler.nodes.FixedWithNextNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import org.graalvm.compiler.nodes.GuardNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    45
import org.graalvm.compiler.nodes.IfNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
import org.graalvm.compiler.nodes.LogicNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import org.graalvm.compiler.nodes.LoopExitNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import org.graalvm.compiler.nodes.ProxyNode;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    49
import org.graalvm.compiler.nodes.StartNode;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    50
import org.graalvm.compiler.nodes.StaticDeoptimizingNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
import org.graalvm.compiler.nodes.StructuredGraph;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
import org.graalvm.compiler.nodes.ValueNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    53
import org.graalvm.compiler.nodes.ValuePhiNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
import org.graalvm.compiler.nodes.calc.CompareNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
import org.graalvm.compiler.nodes.spi.LoweringProvider;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    56
import org.graalvm.compiler.nodes.util.GraphUtil;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    57
import org.graalvm.compiler.phases.BasePhase;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
import org.graalvm.compiler.phases.tiers.PhaseContext;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    59
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    60
import jdk.vm.ci.meta.Constant;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    61
import jdk.vm.ci.meta.DeoptimizationAction;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    62
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
/**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
 * This phase will find branches which always end with a {@link DeoptimizeNode} and replace their
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
 * {@link ControlSplitNode ControlSplitNodes} with {@link FixedGuardNode FixedGuardNodes}.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
 * This is useful because {@link FixedGuardNode FixedGuardNodes} will be lowered to {@link GuardNode
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
 * GuardNodes} which can later be optimized more aggressively than control-flow constructs.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
 * This is currently only done for branches that start from a {@link IfNode}. If it encounters a
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
 * branch starting at an other kind of {@link ControlSplitNode}, it will only bring the
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
 * {@link DeoptimizeNode} as close to the {@link ControlSplitNode} as possible.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
 *
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
 */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    75
public class ConvertDeoptimizeToGuardPhase extends BasePhase<PhaseContext> {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    76
    @Override
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    77
    @SuppressWarnings("try")
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    78
    protected void run(final StructuredGraph graph, PhaseContext context) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
        assert graph.hasValueProxies() : "ConvertDeoptimizeToGuardPhase always creates proxies";
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    80
        assert !graph.getGuardsStage().areFrameStatesAtDeopts() : graph.getGuardsStage();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    81
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
        for (DeoptimizeNode d : graph.getNodes(DeoptimizeNode.TYPE)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
            assert d.isAlive();
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    84
            if (d.getAction() == DeoptimizationAction.None) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    85
                continue;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    86
            }
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    87
            try (DebugCloseable closable = d.withNodeSourcePosition()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    88
                propagateFixed(d, d, context != null ? context.getLowerer() : null);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
    89
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
        if (context != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
            for (FixedGuardNode fixedGuard : graph.getNodes(FixedGuardNode.TYPE)) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    94
                try (DebugCloseable closable = fixedGuard.withNodeSourcePosition()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    95
                    trySplitFixedGuard(fixedGuard, context);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    96
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   100
        new DeadCodeEliminationPhase(Optional).apply(graph);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   101
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   102
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
    private void trySplitFixedGuard(FixedGuardNode fixedGuard, PhaseContext context) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
        LogicNode condition = fixedGuard.condition();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
        if (condition instanceof CompareNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   106
            CompareNode compare = (CompareNode) condition;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   107
            ValueNode x = compare.getX();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   108
            ValuePhiNode xPhi = (x instanceof ValuePhiNode) ? (ValuePhiNode) x : null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
            if (x instanceof ConstantNode || xPhi != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   110
                ValueNode y = compare.getY();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   111
                ValuePhiNode yPhi = (y instanceof ValuePhiNode) ? (ValuePhiNode) y : null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   112
                if (y instanceof ConstantNode || yPhi != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
                    processFixedGuardAndPhis(fixedGuard, context, compare, x, xPhi, y, yPhi);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   117
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   118
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
    private void processFixedGuardAndPhis(FixedGuardNode fixedGuard, PhaseContext context, CompareNode compare, ValueNode x, ValuePhiNode xPhi, ValueNode y, ValuePhiNode yPhi) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
        AbstractBeginNode pred = AbstractBeginNode.prevBegin(fixedGuard);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
        if (pred instanceof AbstractMergeNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   122
            AbstractMergeNode merge = (AbstractMergeNode) pred;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
            if (xPhi != null && xPhi.merge() != merge) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
                return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   125
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   126
            if (yPhi != null && yPhi.merge() != merge) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
                return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   128
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
            processFixedGuardAndMerge(fixedGuard, context, compare, x, xPhi, y, yPhi, merge);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   133
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   134
    private void processFixedGuardAndMerge(FixedGuardNode fixedGuard, PhaseContext context, CompareNode compare, ValueNode x, ValuePhiNode xPhi, ValueNode y, ValuePhiNode yPhi,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   135
                    AbstractMergeNode merge) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
        List<EndNode> mergePredecessors = merge.cfgPredecessors().snapshot();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
        for (int i = 0; i < mergePredecessors.size(); ++i) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
            AbstractEndNode mergePredecessor = mergePredecessors.get(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   139
            if (!mergePredecessor.isAlive()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   140
                break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   141
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   142
            Constant xs;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
            if (xPhi == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   144
                xs = x.asConstant();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   145
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   146
                xs = xPhi.valueAt(mergePredecessor).asConstant();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   147
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   148
            Constant ys;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   149
            if (yPhi == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   150
                ys = y.asConstant();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   151
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   152
                ys = yPhi.valueAt(mergePredecessor).asConstant();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   153
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   154
            if (xs != null && ys != null && compare.condition().foldCondition(xs, ys, context.getConstantReflection(), compare.unorderedIsTrue()) == fixedGuard.isNegated()) {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   155
                propagateFixed(mergePredecessor, fixedGuard, context.getLowerer());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   156
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   157
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   158
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   160
    private void propagateFixed(FixedNode from, StaticDeoptimizingNode deopt, LoweringProvider loweringProvider) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   161
        Node current = from;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   162
        while (current != null) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   163
            if (GraalOptions.GuardPriorities.getValue(from.getOptions()) && current instanceof FixedGuardNode) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   164
                FixedGuardNode otherGuard = (FixedGuardNode) current;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   165
                if (otherGuard.computePriority().isHigherPriorityThan(deopt.computePriority())) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   166
                    moveAsDeoptAfter(otherGuard, deopt);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   167
                    return;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   168
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   169
            } else if (current instanceof AbstractBeginNode) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   170
                if (current instanceof AbstractMergeNode) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   171
                    AbstractMergeNode mergeNode = (AbstractMergeNode) current;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   172
                    FixedNode next = mergeNode.next();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   173
                    while (mergeNode.isAlive()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   174
                        AbstractEndNode end = mergeNode.forwardEnds().first();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   175
                        propagateFixed(end, deopt, loweringProvider);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   176
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   177
                    assert next.isAlive();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   178
                    propagateFixed(next, deopt, loweringProvider);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   179
                    return;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   180
                } else if (current.predecessor() instanceof IfNode) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   181
                    IfNode ifNode = (IfNode) current.predecessor();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   182
                    StructuredGraph graph = ifNode.graph();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   183
                    LogicNode conditionNode = ifNode.condition();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   184
                    boolean negateGuardCondition = current == ifNode.trueSuccessor();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   185
                    FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deopt.getReason(), deopt.getAction(), deopt.getSpeculation(), negateGuardCondition));
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   186
                    FixedWithNextNode pred = (FixedWithNextNode) ifNode.predecessor();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   187
                    AbstractBeginNode survivingSuccessor;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   188
                    if (negateGuardCondition) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   189
                        survivingSuccessor = ifNode.falseSuccessor();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   190
                    } else {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   191
                        survivingSuccessor = ifNode.trueSuccessor();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   192
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   193
                    graph.removeSplitPropagate(ifNode, survivingSuccessor);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   194
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   195
                    Node newGuard = guard;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   196
                    if (survivingSuccessor instanceof LoopExitNode) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   197
                        newGuard = ProxyNode.forGuard(guard, (LoopExitNode) survivingSuccessor, graph);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   198
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   199
                    survivingSuccessor.replaceAtUsages(InputType.Guard, newGuard);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   200
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   201
                    graph.getDebug().log("Converting deopt on %-5s branch of %s to guard for remaining branch %s.", negateGuardCondition, ifNode, survivingSuccessor);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   202
                    FixedNode next = pred.next();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   203
                    pred.setNext(guard);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   204
                    guard.setNext(next);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   205
                    SimplifierTool simplifierTool = GraphUtil.getDefaultSimplifier(null, null, null, false, graph.getAssumptions(), graph.getOptions(), loweringProvider);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   206
                    survivingSuccessor.simplify(simplifierTool);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   207
                    return;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   208
                } else if (current.predecessor() == null || current.predecessor() instanceof ControlSplitNode) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   209
                    assert current.predecessor() != null || (current instanceof StartNode && current == ((AbstractBeginNode) current).graph().start());
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   210
                    moveAsDeoptAfter((AbstractBeginNode) current, deopt);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   211
                    return;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   212
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   213
            }
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   214
            current = current.predecessor();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   215
        }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   216
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   217
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   218
    private static void moveAsDeoptAfter(FixedWithNextNode node, StaticDeoptimizingNode deopt) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   219
        FixedNode next = node.next();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   220
        if (next != deopt.asNode()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47216
diff changeset
   221
            node.setNext(node.graph().add(new DeoptimizeNode(deopt.getAction(), deopt.getReason(), deopt.getSpeculation())));
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   222
            GraphUtil.killCFG(next);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   223
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   224
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   225
}