src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/schedule/SchedulePhase.java
author iveresov
Fri, 02 Feb 2018 17:28:17 -0800
changeset 48861 47f19ff9903c
parent 47798 9fe9292f5931
child 49873 26ebfe8ce852
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
/*
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
     2
 * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
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.schedule;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    24
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    25
import static org.graalvm.collections.Equivalence.IDENTITY;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    26
import static org.graalvm.compiler.core.common.GraalOptions.GuardPriorities;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    27
import static org.graalvm.compiler.core.common.GraalOptions.OptScheduleOutOfLoops;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    28
import static org.graalvm.compiler.core.common.cfg.AbstractControlFlowGraph.strictlyDominates;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    29
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    30
import java.util.ArrayList;
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    31
import java.util.Arrays;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    32
import java.util.Comparator;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    33
import java.util.EnumMap;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    34
import java.util.Formatter;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    35
import java.util.Iterator;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    36
import java.util.List;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    37
import java.util.SortedSet;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    38
import java.util.TreeSet;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    39
import java.util.function.Function;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
    40
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    41
import org.graalvm.collections.EconomicSet;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.core.common.SuppressFBWarnings;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
import org.graalvm.compiler.core.common.cfg.AbstractControlFlowGraph;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import org.graalvm.compiler.core.common.cfg.BlockMap;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    45
import org.graalvm.compiler.debug.Assertions;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    46
import org.graalvm.compiler.graph.Graph.NodeEvent;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import org.graalvm.compiler.graph.Graph.NodeEventListener;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import org.graalvm.compiler.graph.Graph.NodeEventScope;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
import org.graalvm.compiler.graph.Node;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
import org.graalvm.compiler.graph.NodeBitMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
import org.graalvm.compiler.graph.NodeMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
import org.graalvm.compiler.graph.NodeStack;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    53
import org.graalvm.compiler.nodes.AbstractBeginNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
import org.graalvm.compiler.nodes.AbstractEndNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
import org.graalvm.compiler.nodes.AbstractMergeNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    56
import org.graalvm.compiler.nodes.ControlSinkNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    57
import org.graalvm.compiler.nodes.ControlSplitNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    58
import org.graalvm.compiler.nodes.DeoptimizeNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    59
import org.graalvm.compiler.nodes.FixedNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    60
import org.graalvm.compiler.nodes.GuardNode;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    61
import org.graalvm.compiler.nodes.IfNode;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    62
import org.graalvm.compiler.nodes.KillingBeginNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    63
import org.graalvm.compiler.nodes.LoopBeginNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
import org.graalvm.compiler.nodes.LoopExitNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    65
import org.graalvm.compiler.nodes.PhiNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
import org.graalvm.compiler.nodes.ProxyNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
import org.graalvm.compiler.nodes.StartNode;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    68
import org.graalvm.compiler.nodes.StaticDeoptimizingNode;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    69
import org.graalvm.compiler.nodes.StaticDeoptimizingNode.GuardPriority;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    70
import org.graalvm.compiler.nodes.StructuredGraph;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
import org.graalvm.compiler.nodes.StructuredGraph.GuardsStage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
import org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
import org.graalvm.compiler.nodes.ValueNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
import org.graalvm.compiler.nodes.VirtualState;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    75
import org.graalvm.compiler.nodes.calc.ConvertNode;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    76
import org.graalvm.compiler.nodes.calc.IsNullNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    77
import org.graalvm.compiler.nodes.cfg.Block;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    78
import org.graalvm.compiler.nodes.cfg.ControlFlowGraph;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
import org.graalvm.compiler.nodes.cfg.HIRLoop;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    80
import org.graalvm.compiler.nodes.cfg.LocationSet;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
import org.graalvm.compiler.nodes.memory.FloatingReadNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
import org.graalvm.compiler.nodes.memory.MemoryCheckpoint;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    83
import org.graalvm.compiler.nodes.spi.ValueProxy;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
    84
import org.graalvm.compiler.options.OptionValues;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
import org.graalvm.compiler.phases.Phase;
46551
d01034a83ab2 8182557: Update Graal
iveresov
parents: 46509
diff changeset
    86
import org.graalvm.word.LocationIdentity;
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
    87
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
public final class SchedulePhase extends Phase {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
    public enum SchedulingStrategy {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    91
        EARLIEST_WITH_GUARD_ORDER,
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
        EARLIEST,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
        LATEST,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
        LATEST_OUT_OF_LOOPS,
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    95
        FINAL_SCHEDULE;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    96
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    97
        public boolean isEarliest() {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    98
            return this == EARLIEST || this == EARLIEST_WITH_GUARD_ORDER;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    99
        }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   100
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   101
        public boolean isLatest() {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   102
            return !isEarliest();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   103
        }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   105
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   106
    private final SchedulingStrategy selectedStrategy;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   107
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   108
    private final boolean immutableGraph;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   109
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   110
    public SchedulePhase(OptionValues options) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   111
        this(false, options);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   112
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   114
    public SchedulePhase(boolean immutableGraph, OptionValues options) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   115
        this(OptScheduleOutOfLoops.getValue(options) ? SchedulingStrategy.LATEST_OUT_OF_LOOPS : SchedulingStrategy.LATEST, immutableGraph);
43972
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
    public SchedulePhase(SchedulingStrategy strategy) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
        this(strategy, false);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   121
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   122
    public SchedulePhase(SchedulingStrategy strategy, boolean immutableGraph) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   123
        this.selectedStrategy = strategy;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   124
        this.immutableGraph = immutableGraph;
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   127
    private NodeEventScope verifyImmutableGraph(StructuredGraph graph) {
46762
f7defa99f173 8185829: Update Graal
dlong
parents: 46640
diff changeset
   128
        if (immutableGraph && Assertions.assertionsEnabled()) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   129
            return graph.trackNodeEvents(new NodeEventListener() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   130
                @Override
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   131
                public void changed(NodeEvent e, Node node) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
                    assert false : "graph changed: " + e + " on node " + node;
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
            });
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   135
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
            return null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   137
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   138
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   139
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   140
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   141
    @SuppressWarnings("try")
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   142
    protected void run(StructuredGraph graph) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
        try (NodeEventScope scope = verifyImmutableGraph(graph)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   144
            Instance inst = new Instance();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   145
            inst.run(graph, selectedStrategy, immutableGraph);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   146
        }
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
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   149
    public static void run(StructuredGraph graph, SchedulingStrategy strategy, ControlFlowGraph cfg) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   150
        Instance inst = new Instance(cfg);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   151
        inst.run(graph, strategy, false);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   152
    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   153
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   154
    public static class Instance {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   155
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   156
        private static final double IMPLICIT_NULL_CHECK_OPPORTUNITY_PROBABILITY_FACTOR = 2;
43972
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
         * Map from blocks to the nodes in each block.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   159
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   160
        protected ControlFlowGraph cfg;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   161
        protected BlockMap<List<Node>> blockToNodesMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   162
        protected NodeMap<Block> nodeToBlockMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   163
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   164
        public Instance() {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   165
            this(null);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   166
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   167
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   168
        public Instance(ControlFlowGraph cfg) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   169
            this.cfg = cfg;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   170
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   171
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   172
        @SuppressWarnings("try")
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   173
        public void run(StructuredGraph graph, SchedulingStrategy selectedStrategy, boolean immutableGraph) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   174
            // assert GraphOrder.assertNonCyclicGraph(graph);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   175
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   176
            if (this.cfg == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   177
                this.cfg = ControlFlowGraph.compute(graph, true, true, true, false);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   178
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   179
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   180
            NodeMap<Block> currentNodeMap = graph.createNodeMap();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   181
            NodeBitMap visited = graph.createNodeBitMap();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   182
            BlockMap<List<Node>> earliestBlockToNodesMap = new BlockMap<>(cfg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   183
            this.nodeToBlockMap = currentNodeMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   184
            this.blockToNodesMap = earliestBlockToNodesMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   185
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   186
            scheduleEarliestIterative(earliestBlockToNodesMap, currentNodeMap, visited, graph, immutableGraph, selectedStrategy == SchedulingStrategy.EARLIEST_WITH_GUARD_ORDER);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   187
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   188
            if (!selectedStrategy.isEarliest()) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   189
                // For non-earliest schedules, we need to do a second pass.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   190
                BlockMap<List<Node>> latestBlockToNodesMap = new BlockMap<>(cfg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   191
                for (Block b : cfg.getBlocks()) {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   192
                    latestBlockToNodesMap.put(b, new ArrayList<>());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   193
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   194
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   195
                BlockMap<ArrayList<FloatingReadNode>> watchListMap = calcLatestBlocks(selectedStrategy, currentNodeMap, earliestBlockToNodesMap, visited, latestBlockToNodesMap, immutableGraph);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   196
                sortNodesLatestWithinBlock(cfg, earliestBlockToNodesMap, latestBlockToNodesMap, currentNodeMap, watchListMap, visited);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   197
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   198
                assert verifySchedule(cfg, latestBlockToNodesMap, currentNodeMap);
46762
f7defa99f173 8185829: Update Graal
dlong
parents: 46640
diff changeset
   199
                assert (!Assertions.detailedAssertionsEnabled(graph.getOptions())) || MemoryScheduleVerification.check(cfg.getStartBlock(), latestBlockToNodesMap);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   200
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   201
                this.blockToNodesMap = latestBlockToNodesMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   202
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   203
            }
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   204
            cfg.setNodeToBlock(currentNodeMap);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   205
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   206
            graph.setLastSchedule(new ScheduleResult(this.cfg, this.nodeToBlockMap, this.blockToNodesMap));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   207
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   208
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   209
        @SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE", justification = "false positive found by findbugs")
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   210
        private BlockMap<ArrayList<FloatingReadNode>> calcLatestBlocks(SchedulingStrategy strategy, NodeMap<Block> currentNodeMap, BlockMap<List<Node>> earliestBlockToNodesMap, NodeBitMap visited,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   211
                        BlockMap<List<Node>> latestBlockToNodesMap, boolean immutableGraph) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   212
            BlockMap<ArrayList<FloatingReadNode>> watchListMap = new BlockMap<>(cfg);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   213
            Block[] reversePostOrder = cfg.reversePostOrder();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   214
            for (int j = reversePostOrder.length - 1; j >= 0; --j) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   215
                Block currentBlock = reversePostOrder[j];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   216
                List<Node> blockToNodes = earliestBlockToNodesMap.get(currentBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   217
                LocationSet killed = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   218
                int previousIndex = blockToNodes.size();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   219
                for (int i = blockToNodes.size() - 1; i >= 0; --i) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   220
                    Node currentNode = blockToNodes.get(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   221
                    assert currentNodeMap.get(currentNode) == currentBlock;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   222
                    assert !(currentNode instanceof PhiNode) && !(currentNode instanceof ProxyNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   223
                    assert visited.isMarked(currentNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   224
                    if (currentNode instanceof FixedNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   225
                        // For these nodes, the earliest is at the same time the latest block.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   226
                    } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   227
                        Block latestBlock = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   228
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   229
                        LocationIdentity constrainingLocation = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   230
                        if (currentNode instanceof FloatingReadNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   231
                            // We are scheduling a floating read node => check memory
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   232
                            // anti-dependencies.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   233
                            FloatingReadNode floatingReadNode = (FloatingReadNode) currentNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   234
                            LocationIdentity location = floatingReadNode.getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   235
                            if (location.isMutable()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   236
                                // Location can be killed.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   237
                                constrainingLocation = location;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   238
                                if (currentBlock.canKill(location)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   239
                                    if (killed == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   240
                                        killed = new LocationSet();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   241
                                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   242
                                    fillKillSet(killed, blockToNodes.subList(i + 1, previousIndex));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   243
                                    previousIndex = i;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   244
                                    if (killed.contains(location)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   245
                                        // Earliest block kills location => we need to stay within
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   246
                                        // earliest block.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   247
                                        latestBlock = currentBlock;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   248
                                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   249
                                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   250
                            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   251
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   252
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   253
                        if (latestBlock == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   254
                            // We are not constraint within earliest block => calculate optimized
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   255
                            // schedule.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   256
                            calcLatestBlock(currentBlock, strategy, currentNode, currentNodeMap, constrainingLocation, watchListMap, latestBlockToNodesMap, visited, immutableGraph);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   257
                        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   258
                            selectLatestBlock(currentNode, currentBlock, latestBlock, currentNodeMap, watchListMap, constrainingLocation, latestBlockToNodesMap);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   259
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   260
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   261
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   262
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   263
            return watchListMap;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   264
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   265
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   266
        protected static void selectLatestBlock(Node currentNode, Block currentBlock, Block latestBlock, NodeMap<Block> currentNodeMap, BlockMap<ArrayList<FloatingReadNode>> watchListMap,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   267
                        LocationIdentity constrainingLocation, BlockMap<List<Node>> latestBlockToNodesMap) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   268
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
            assert checkLatestEarliestRelation(currentNode, currentBlock, latestBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
            if (currentBlock != latestBlock) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   271
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   272
                currentNodeMap.setAndGrow(currentNode, latestBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   273
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   274
                if (constrainingLocation != null && latestBlock.canKill(constrainingLocation)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   275
                    if (watchListMap.get(latestBlock) == null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   276
                        watchListMap.put(latestBlock, new ArrayList<>());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   277
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   278
                    watchListMap.get(latestBlock).add((FloatingReadNode) currentNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   279
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   280
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   281
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   282
            latestBlockToNodesMap.get(latestBlock).add(currentNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   283
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   284
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   285
        private static boolean checkLatestEarliestRelation(Node currentNode, Block earliestBlock, Block latestBlock) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   286
            assert AbstractControlFlowGraph.dominates(earliestBlock, latestBlock) || (currentNode instanceof VirtualState && latestBlock == earliestBlock.getDominator()) : String.format(
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   287
                            "%s %s (%s) %s (%s)", currentNode, earliestBlock, earliestBlock.getBeginNode(), latestBlock, latestBlock.getBeginNode());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   288
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   289
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   290
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   291
        private static boolean verifySchedule(ControlFlowGraph cfg, BlockMap<List<Node>> blockToNodesMap, NodeMap<Block> nodeMap) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   292
            for (Block b : cfg.getBlocks()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   293
                List<Node> nodes = blockToNodesMap.get(b);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   294
                for (Node n : nodes) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   295
                    assert n.isAlive();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   296
                    assert nodeMap.get(n) == b;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   297
                    StructuredGraph g = (StructuredGraph) n.graph();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   298
                    if (g.hasLoops() && g.getGuardsStage() == GuardsStage.AFTER_FSA && n instanceof DeoptimizeNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   299
                        assert b.getLoopDepth() == 0 : n;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   300
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   301
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   302
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   303
            return true;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   304
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   305
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   306
        public static Block checkKillsBetween(Block earliestBlock, Block latestBlock, LocationIdentity location) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   307
            assert strictlyDominates(earliestBlock, latestBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   308
            Block current = latestBlock.getDominator();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   309
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   310
            // Collect dominator chain that needs checking.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   311
            List<Block> dominatorChain = new ArrayList<>();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   312
            dominatorChain.add(latestBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   313
            while (current != earliestBlock) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   314
                // Current is an intermediate dominator between earliestBlock and latestBlock.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   315
                assert strictlyDominates(earliestBlock, current) && strictlyDominates(current, latestBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   316
                if (current.canKill(location)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   317
                    dominatorChain.clear();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   318
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   319
                dominatorChain.add(current);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   320
                current = current.getDominator();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   321
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   322
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   323
            // The first element of dominatorChain now contains the latest possible block.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   324
            assert dominatorChain.size() >= 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   325
            assert dominatorChain.get(dominatorChain.size() - 1).getDominator() == earliestBlock;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   326
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   327
            Block lastBlock = earliestBlock;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   328
            for (int i = dominatorChain.size() - 1; i >= 0; --i) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   329
                Block currentBlock = dominatorChain.get(i);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   330
                if (currentBlock.getLoopDepth() > lastBlock.getLoopDepth()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   331
                    // We are entering a loop boundary. The new loops must not kill the location for
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   332
                    // the crossing to be safe.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   333
                    if (currentBlock.getLoop() != null && ((HIRLoop) currentBlock.getLoop()).canKill(location)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   334
                        break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   335
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   336
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   337
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   338
                if (currentBlock.canKillBetweenThisAndDominator(location)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   339
                    break;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   340
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   341
                lastBlock = currentBlock;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   342
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   343
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   344
            if (lastBlock.getBeginNode() instanceof KillingBeginNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   345
                LocationIdentity locationIdentity = ((KillingBeginNode) lastBlock.getBeginNode()).getLocationIdentity();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   346
                if ((locationIdentity.isAny() || locationIdentity.equals(location)) && lastBlock != earliestBlock) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   347
                    // The begin of this block kills the location, so we *have* to schedule the node
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   348
                    // in the dominating block.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   349
                    lastBlock = lastBlock.getDominator();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   350
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   351
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   352
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   353
            return lastBlock;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   354
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   355
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   356
        private static void fillKillSet(LocationSet killed, List<Node> subList) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   357
            if (!killed.isAny()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   358
                for (Node n : subList) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   359
                    // Check if this node kills a node in the watch list.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   360
                    if (n instanceof MemoryCheckpoint.Single) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   361
                        LocationIdentity identity = ((MemoryCheckpoint.Single) n).getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   362
                        killed.add(identity);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   363
                        if (killed.isAny()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   364
                            return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   365
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   366
                    } else if (n instanceof MemoryCheckpoint.Multi) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   367
                        for (LocationIdentity identity : ((MemoryCheckpoint.Multi) n).getLocationIdentities()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   368
                            killed.add(identity);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   369
                            if (killed.isAny()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   370
                                return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   371
                            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   372
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   373
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   374
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   375
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   376
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   377
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   378
        private static void sortNodesLatestWithinBlock(ControlFlowGraph cfg, BlockMap<List<Node>> earliestBlockToNodesMap, BlockMap<List<Node>> latestBlockToNodesMap, NodeMap<Block> currentNodeMap,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   379
                        BlockMap<ArrayList<FloatingReadNode>> watchListMap, NodeBitMap visited) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   380
            for (Block b : cfg.getBlocks()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   381
                sortNodesLatestWithinBlock(b, earliestBlockToNodesMap, latestBlockToNodesMap, currentNodeMap, watchListMap, visited);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   382
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   383
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   384
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   385
        private static void sortNodesLatestWithinBlock(Block b, BlockMap<List<Node>> earliestBlockToNodesMap, BlockMap<List<Node>> latestBlockToNodesMap, NodeMap<Block> nodeMap,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   386
                        BlockMap<ArrayList<FloatingReadNode>> watchListMap, NodeBitMap unprocessed) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   387
            List<Node> earliestSorting = earliestBlockToNodesMap.get(b);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   388
            ArrayList<Node> result = new ArrayList<>(earliestSorting.size());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   389
            ArrayList<FloatingReadNode> watchList = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   390
            if (watchListMap != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   391
                watchList = watchListMap.get(b);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   392
                assert watchList == null || !b.getKillLocations().isEmpty();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   393
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   394
            AbstractBeginNode beginNode = b.getBeginNode();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   395
            if (beginNode instanceof LoopExitNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   396
                LoopExitNode loopExitNode = (LoopExitNode) beginNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   397
                for (ProxyNode proxy : loopExitNode.proxies()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   398
                    unprocessed.clear(proxy);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   399
                    ValueNode value = proxy.value();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   400
                    // if multiple proxies reference the same value, schedule the value of a
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   401
                    // proxy once
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   402
                    if (value != null && nodeMap.get(value) == b && unprocessed.isMarked(value)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   403
                        sortIntoList(value, b, result, nodeMap, unprocessed, null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   404
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   405
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   406
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   407
            FixedNode endNode = b.getEndNode();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   408
            FixedNode fixedEndNode = null;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   409
            if (isFixedEnd(endNode)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   410
                // Only if the end node is either a control split or an end node, we need to force
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   411
                // it to be the last node in the schedule.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   412
                fixedEndNode = endNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   413
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   414
            for (Node n : earliestSorting) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   415
                if (n != fixedEndNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   416
                    if (n instanceof FixedNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   417
                        assert nodeMap.get(n) == b;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   418
                        checkWatchList(b, nodeMap, unprocessed, result, watchList, n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   419
                        sortIntoList(n, b, result, nodeMap, unprocessed, null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   420
                    } else if (nodeMap.get(n) == b && n instanceof FloatingReadNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   421
                        FloatingReadNode floatingReadNode = (FloatingReadNode) n;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   422
                        if (isImplicitNullOpportunity(floatingReadNode, b)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   423
                            // Schedule at the beginning of the block.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   424
                            sortIntoList(floatingReadNode, b, result, nodeMap, unprocessed, null);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   425
                        } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   426
                            LocationIdentity location = floatingReadNode.getLocationIdentity();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   427
                            if (b.canKill(location)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   428
                                // This read can be killed in this block, add to watch list.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   429
                                if (watchList == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   430
                                    watchList = new ArrayList<>();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   431
                                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   432
                                watchList.add(floatingReadNode);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   433
                            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   434
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   435
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   436
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   437
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   438
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   439
            for (Node n : latestBlockToNodesMap.get(b)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   440
                assert nodeMap.get(n) == b : n;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   441
                assert !(n instanceof FixedNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   442
                if (unprocessed.isMarked(n)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   443
                    sortIntoList(n, b, result, nodeMap, unprocessed, fixedEndNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   444
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   445
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   446
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   447
            if (endNode != null && unprocessed.isMarked(endNode)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   448
                sortIntoList(endNode, b, result, nodeMap, unprocessed, null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   449
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   450
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   451
            latestBlockToNodesMap.put(b, result);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   452
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   453
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   454
        private static void checkWatchList(Block b, NodeMap<Block> nodeMap, NodeBitMap unprocessed, ArrayList<Node> result, ArrayList<FloatingReadNode> watchList, Node n) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   455
            if (watchList != null && !watchList.isEmpty()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   456
                // Check if this node kills a node in the watch list.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   457
                if (n instanceof MemoryCheckpoint.Single) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   458
                    LocationIdentity identity = ((MemoryCheckpoint.Single) n).getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   459
                    checkWatchList(watchList, identity, b, result, nodeMap, unprocessed);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   460
                } else if (n instanceof MemoryCheckpoint.Multi) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   461
                    for (LocationIdentity identity : ((MemoryCheckpoint.Multi) n).getLocationIdentities()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   462
                        checkWatchList(watchList, identity, b, result, nodeMap, unprocessed);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   463
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   464
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   465
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   466
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   467
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   468
        private static void checkWatchList(ArrayList<FloatingReadNode> watchList, LocationIdentity identity, Block b, ArrayList<Node> result, NodeMap<Block> nodeMap, NodeBitMap unprocessed) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   469
            if (identity.isImmutable()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   470
                // Nothing to do. This can happen for an initialization write.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   471
            } else if (identity.isAny()) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   472
                for (FloatingReadNode r : watchList) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   473
                    if (unprocessed.isMarked(r)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   474
                        sortIntoList(r, b, result, nodeMap, unprocessed, null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   475
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   476
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   477
                watchList.clear();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   478
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   479
                int index = 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   480
                while (index < watchList.size()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   481
                    FloatingReadNode r = watchList.get(index);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   482
                    LocationIdentity locationIdentity = r.getLocationIdentity();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   483
                    assert locationIdentity.isMutable();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   484
                    if (unprocessed.isMarked(r)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   485
                        if (identity.overlaps(locationIdentity)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   486
                            sortIntoList(r, b, result, nodeMap, unprocessed, null);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   487
                        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   488
                            ++index;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   489
                            continue;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   490
                        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   491
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   492
                    int lastIndex = watchList.size() - 1;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   493
                    watchList.set(index, watchList.get(lastIndex));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   494
                    watchList.remove(lastIndex);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   495
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   496
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   497
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   498
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   499
        private static void sortIntoList(Node n, Block b, ArrayList<Node> result, NodeMap<Block> nodeMap, NodeBitMap unprocessed, Node excludeNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   500
            assert unprocessed.isMarked(n) : n;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   501
            assert nodeMap.get(n) == b;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   502
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   503
            if (n instanceof PhiNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   504
                return;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   505
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   506
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   507
            unprocessed.clear(n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   508
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   509
            for (Node input : n.inputs()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   510
                if (nodeMap.get(input) == b && unprocessed.isMarked(input) && input != excludeNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   511
                    sortIntoList(input, b, result, nodeMap, unprocessed, excludeNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   512
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   513
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   514
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   515
            if (n instanceof ProxyNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   516
                // Skip proxy nodes.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   517
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   518
                result.add(n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   519
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   520
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   521
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   522
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   523
        protected void calcLatestBlock(Block earliestBlock, SchedulingStrategy strategy, Node currentNode, NodeMap<Block> currentNodeMap, LocationIdentity constrainingLocation,
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   524
                        BlockMap<ArrayList<FloatingReadNode>> watchListMap, BlockMap<List<Node>> latestBlockToNodesMap, NodeBitMap visited, boolean immutableGraph) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   525
            Block latestBlock = null;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   526
            if (!currentNode.hasUsages()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   527
                assert currentNode instanceof GuardNode;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   528
                latestBlock = earliestBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   529
            } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   530
                assert currentNode.hasUsages();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   531
                for (Node usage : currentNode.usages()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   532
                    if (immutableGraph && !visited.contains(usage)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   533
                        /*
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   534
                         * Normally, dead nodes are deleted by the scheduler before we reach this
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   535
                         * point. Only when the scheduler is asked to not modify a graph, we can see
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   536
                         * dead nodes here.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   537
                         */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   538
                        continue;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   539
                    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   540
                    latestBlock = calcBlockForUsage(currentNode, usage, latestBlock, currentNodeMap);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   541
                }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   542
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   543
                assert latestBlock != null : currentNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   544
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   545
                if (strategy == SchedulingStrategy.FINAL_SCHEDULE || strategy == SchedulingStrategy.LATEST_OUT_OF_LOOPS) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   546
                    Block currentBlock = latestBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   547
                    while (currentBlock.getLoopDepth() > earliestBlock.getLoopDepth() && currentBlock != earliestBlock.getDominator()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   548
                        Block previousCurrentBlock = currentBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   549
                        currentBlock = currentBlock.getDominator();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   550
                        if (previousCurrentBlock.isLoopHeader()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   551
                            if (currentBlock.probability() < latestBlock.probability() || ((StructuredGraph) currentNode.graph()).hasValueProxies()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   552
                                // Only assign new latest block if frequency is actually lower or if
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   553
                                // loop proxies would be required otherwise.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   554
                                latestBlock = currentBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   555
                            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   556
                        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   557
                    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   558
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   559
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   560
                if (latestBlock != earliestBlock && latestBlock != earliestBlock.getDominator() && constrainingLocation != null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   561
                    latestBlock = checkKillsBetween(earliestBlock, latestBlock, constrainingLocation);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   562
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   563
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   564
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   565
            if (latestBlock != earliestBlock && currentNode instanceof FloatingReadNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   566
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   567
                FloatingReadNode floatingReadNode = (FloatingReadNode) currentNode;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   568
                if (isImplicitNullOpportunity(floatingReadNode, earliestBlock) && earliestBlock.probability() < latestBlock.probability() * IMPLICIT_NULL_CHECK_OPPORTUNITY_PROBABILITY_FACTOR) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   569
                    latestBlock = earliestBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   570
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   571
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   572
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   573
            selectLatestBlock(currentNode, earliestBlock, latestBlock, currentNodeMap, watchListMap, constrainingLocation, latestBlockToNodesMap);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   574
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   575
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   576
        private static boolean isImplicitNullOpportunity(FloatingReadNode floatingReadNode, Block block) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   577
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   578
            Node pred = block.getBeginNode().predecessor();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   579
            if (pred instanceof IfNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   580
                IfNode ifNode = (IfNode) pred;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   581
                if (ifNode.condition() instanceof IsNullNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   582
                    IsNullNode isNullNode = (IsNullNode) ifNode.condition();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   583
                    if (getUnproxifiedUncompressed(floatingReadNode.getAddress().getBase()) == getUnproxifiedUncompressed(isNullNode.getValue())) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   584
                        return true;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   585
                    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   586
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   587
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   588
            return false;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   589
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   590
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   591
        private static Node getUnproxifiedUncompressed(Node node) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   592
            Node result = node;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   593
            while (true) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   594
                if (result instanceof ValueProxy) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   595
                    ValueProxy valueProxy = (ValueProxy) result;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   596
                    result = valueProxy.getOriginalNode();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   597
                } else if (result instanceof ConvertNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   598
                    ConvertNode convertNode = (ConvertNode) result;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   599
                    if (convertNode.mayNullCheckSkipConversion()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   600
                        result = convertNode.getValue();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   601
                    } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   602
                        break;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   603
                    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   604
                } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   605
                    break;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   606
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   607
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   608
            return result;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   609
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   610
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   611
        private static Block calcBlockForUsage(Node node, Node usage, Block startBlock, NodeMap<Block> currentNodeMap) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   612
            assert !(node instanceof PhiNode);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   613
            Block currentBlock = startBlock;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   614
            if (usage instanceof PhiNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   615
                // An input to a PhiNode is used at the end of the predecessor block that
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   616
                // corresponds to the PhiNode input. One PhiNode can use an input multiple times.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   617
                PhiNode phi = (PhiNode) usage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   618
                AbstractMergeNode merge = phi.merge();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   619
                Block mergeBlock = currentNodeMap.get(merge);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   620
                for (int i = 0; i < phi.valueCount(); ++i) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   621
                    if (phi.valueAt(i) == node) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   622
                        Block otherBlock = mergeBlock.getPredecessors()[i];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   623
                        currentBlock = AbstractControlFlowGraph.commonDominatorTyped(currentBlock, otherBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   624
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   625
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   626
            } else if (usage instanceof AbstractBeginNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   627
                AbstractBeginNode abstractBeginNode = (AbstractBeginNode) usage;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   628
                if (abstractBeginNode instanceof StartNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   629
                    currentBlock = AbstractControlFlowGraph.commonDominatorTyped(currentBlock, currentNodeMap.get(abstractBeginNode));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   630
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   631
                    Block otherBlock = currentNodeMap.get(abstractBeginNode).getDominator();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   632
                    currentBlock = AbstractControlFlowGraph.commonDominatorTyped(currentBlock, otherBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   633
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   634
            } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   635
                // All other types of usages: Put the input into the same block as the usage.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   636
                Block otherBlock = currentNodeMap.get(usage);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   637
                if (usage instanceof ProxyNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   638
                    ProxyNode proxyNode = (ProxyNode) usage;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   639
                    otherBlock = currentNodeMap.get(proxyNode.proxyPoint());
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   640
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   641
                }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   642
                currentBlock = AbstractControlFlowGraph.commonDominatorTyped(currentBlock, otherBlock);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   643
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   644
            return currentBlock;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   645
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   646
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   647
        /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   648
         * Micro block that is allocated for each fixed node and captures all floating nodes that
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   649
         * need to be scheduled immediately after the corresponding fixed node.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   650
         */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   651
        private static class MicroBlock {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   652
            private final int id;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   653
            private int nodeCount;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   654
            private NodeEntry head;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   655
            private NodeEntry tail;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   656
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   657
            MicroBlock(int id) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   658
                this.id = id;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   659
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   660
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   661
            /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   662
             * Adds a new floating node into the micro block.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   663
             */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   664
            public void add(Node node) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   665
                assert !(node instanceof FixedNode) : node;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   666
                NodeEntry newTail = new NodeEntry(node);
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   667
                if (tail == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   668
                    tail = head = newTail;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   669
                } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   670
                    tail.next = newTail;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   671
                    tail = newTail;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   672
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   673
                nodeCount++;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   674
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   675
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   676
            /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   677
             * Number of nodes in this micro block.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   678
             */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   679
            public int getNodeCount() {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   680
                assert getActualNodeCount() == nodeCount : getActualNodeCount() + " != " + nodeCount;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   681
                return nodeCount;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   682
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   683
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   684
            private int getActualNodeCount() {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   685
                int count = 0;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   686
                for (NodeEntry e = head; e != null; e = e.next) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   687
                    count++;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   688
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   689
                return count;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   690
            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   691
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   692
            /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   693
             * The id of the micro block, with a block always associated with a lower id than its
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   694
             * successors.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   695
             */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   696
            public int getId() {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   697
                return id;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   698
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   699
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   700
            /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   701
             * First node of the linked list of nodes of this micro block.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   702
             */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   703
            public NodeEntry getFirstNode() {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   704
                return head;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   705
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   706
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   707
            /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   708
             * Takes all nodes in this micro blocks and prepends them to the nodes of the given
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   709
             * parameter.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   710
             *
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   711
             * @param newBlock the new block for the nodes
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   712
             */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   713
            public void prependChildrenTo(MicroBlock newBlock) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   714
                if (tail != null) {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   715
                    assert head != null;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   716
                    tail.next = newBlock.head;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   717
                    newBlock.head = head;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   718
                    head = tail = null;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   719
                    newBlock.nodeCount += nodeCount;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   720
                    nodeCount = 0;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   721
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   722
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   723
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   724
            @Override
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   725
            public String toString() {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   726
                return String.format("MicroBlock[id=%d]", id);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   727
            }
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   728
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   729
            @Override
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   730
            public int hashCode() {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   731
                return id;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   732
            }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   733
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   734
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   735
        /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   736
         * Entry in the linked list of nodes.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   737
         */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   738
        private static class NodeEntry {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   739
            private final Node node;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   740
            private NodeEntry next;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   741
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   742
            NodeEntry(Node node) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   743
                this.node = node;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   744
                this.next = null;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   745
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   746
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   747
            public NodeEntry getNext() {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   748
                return next;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   749
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   750
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   751
            public Node getNode() {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   752
                return node;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   753
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   754
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   755
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   756
        private void scheduleEarliestIterative(BlockMap<List<Node>> blockToNodes, NodeMap<Block> nodeToBlock, NodeBitMap visited, StructuredGraph graph, boolean immutableGraph,
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   757
                        boolean withGuardOrder) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   758
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   759
            NodeMap<MicroBlock> entries = graph.createNodeMap();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   760
            NodeStack stack = new NodeStack();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   761
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   762
            // Initialize with fixed nodes.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   763
            MicroBlock startBlock = null;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   764
            int nextId = 1;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   765
            for (Block b : cfg.reversePostOrder()) {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   766
                for (FixedNode current : b.getBeginNode().getBlockNodes()) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   767
                    MicroBlock microBlock = new MicroBlock(nextId++);
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   768
                    entries.set(current, microBlock);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   769
                    boolean isNew = visited.checkAndMarkInc(current);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   770
                    assert isNew;
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   771
                    if (startBlock == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   772
                        startBlock = microBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   773
                    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   774
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   775
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   776
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   777
            if (graph.getGuardsStage().allowsFloatingGuards() && graph.getNodes(GuardNode.TYPE).isNotEmpty()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   778
                // Now process guards.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   779
                if (GuardPriorities.getValue(graph.getOptions()) && withGuardOrder) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   780
                    EnumMap<GuardPriority, List<GuardNode>> guardsByPriority = new EnumMap<>(GuardPriority.class);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   781
                    for (GuardNode guard : graph.getNodes(GuardNode.TYPE)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   782
                        guardsByPriority.computeIfAbsent(guard.computePriority(), p -> new ArrayList<>()).add(guard);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   783
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   784
                    // `EnumMap.values` returns values in "natural" key order
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   785
                    for (List<GuardNode> guards : guardsByPriority.values()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   786
                        processNodes(visited, entries, stack, startBlock, guards);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   787
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   788
                    GuardOrder.resortGuards(graph, entries, stack);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   789
                } else {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   790
                    processNodes(visited, entries, stack, startBlock, graph.getNodes(GuardNode.TYPE));
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   791
                }
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   792
            } else {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   793
                assert graph.getNodes(GuardNode.TYPE).isEmpty();
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   794
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   795
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   796
            // Now process inputs of fixed nodes.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   797
            for (Block b : cfg.reversePostOrder()) {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   798
                for (FixedNode current : b.getBeginNode().getBlockNodes()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   799
                    processNodes(visited, entries, stack, startBlock, current.inputs());
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   800
                }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   801
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   802
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   803
            if (visited.getCounter() < graph.getNodeCount()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   804
                // Visit back input edges of loop phis.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   805
                boolean changed;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   806
                boolean unmarkedPhi;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   807
                do {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   808
                    changed = false;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   809
                    unmarkedPhi = false;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   810
                    for (LoopBeginNode loopBegin : graph.getNodes(LoopBeginNode.TYPE)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   811
                        for (PhiNode phi : loopBegin.phis()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   812
                            if (visited.isMarked(phi)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   813
                                for (int i = 0; i < loopBegin.getLoopEndCount(); ++i) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   814
                                    Node node = phi.valueAt(i + loopBegin.forwardEndCount());
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   815
                                    if (node != null && entries.get(node) == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   816
                                        changed = true;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   817
                                        processStack(node, startBlock, entries, visited, stack);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   818
                                    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   819
                                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   820
                            } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   821
                                unmarkedPhi = true;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   822
                            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   823
                        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   824
                    }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   825
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   826
                    /*
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   827
                     * the processing of one loop phi could have marked a previously checked loop
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   828
                     * phi, therefore this needs to be iterative.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   829
                     */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   830
                } while (unmarkedPhi && changed);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   831
            }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   832
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   833
            // Check for dead nodes.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   834
            if (!immutableGraph && visited.getCounter() < graph.getNodeCount()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   835
                for (Node n : graph.getNodes()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   836
                    if (!visited.isMarked(n)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   837
                        n.clearInputs();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   838
                        n.markDeleted();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   839
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   840
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   841
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   842
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   843
            for (Block b : cfg.reversePostOrder()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   844
                FixedNode fixedNode = b.getEndNode();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   845
                if (fixedNode instanceof ControlSplitNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   846
                    ControlSplitNode controlSplitNode = (ControlSplitNode) fixedNode;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   847
                    MicroBlock endBlock = entries.get(fixedNode);
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   848
                    AbstractBeginNode primarySuccessor = controlSplitNode.getPrimarySuccessor();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   849
                    if (primarySuccessor != null) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   850
                        endBlock.prependChildrenTo(entries.get(primarySuccessor));
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   851
                    } else {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   852
                        assert endBlock.tail == null;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   853
                    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   854
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   855
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   856
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   857
            // Create lists for each block
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   858
            for (Block b : cfg.reversePostOrder()) {
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   859
                // Count nodes in block
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   860
                int totalCount = 0;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   861
                for (FixedNode current : b.getBeginNode().getBlockNodes()) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   862
                    MicroBlock microBlock = entries.get(current);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   863
                    totalCount += microBlock.getNodeCount() + 1;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   864
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   865
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   866
                // Initialize with begin node, it is always the first node.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   867
                ArrayList<Node> nodes = new ArrayList<>(totalCount);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   868
                blockToNodes.put(b, nodes);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   869
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   870
                for (FixedNode current : b.getBeginNode().getBlockNodes()) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   871
                    MicroBlock microBlock = entries.get(current);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   872
                    nodeToBlock.set(current, b);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   873
                    nodes.add(current);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   874
                    NodeEntry next = microBlock.getFirstNode();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   875
                    while (next != null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   876
                        Node nextNode = next.getNode();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   877
                        nodeToBlock.set(nextNode, b);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   878
                        nodes.add(nextNode);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   879
                        next = next.getNext();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   880
                    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   881
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   882
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   883
46762
f7defa99f173 8185829: Update Graal
dlong
parents: 46640
diff changeset
   884
            assert (!Assertions.detailedAssertionsEnabled(cfg.graph.getOptions())) || MemoryScheduleVerification.check(cfg.getStartBlock(), blockToNodes);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   885
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   886
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   887
        private static void processNodes(NodeBitMap visited, NodeMap<MicroBlock> entries, NodeStack stack, MicroBlock startBlock, Iterable<? extends Node> nodes) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   888
            for (Node node : nodes) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   889
                if (entries.get(node) == null) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   890
                    processStack(node, startBlock, entries, visited, stack);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   891
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   892
            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   893
        }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   894
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   895
        private static void processStackPhi(NodeStack stack, PhiNode phiNode, NodeMap<MicroBlock> nodeToBlock, NodeBitMap visited) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   896
            stack.pop();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   897
            if (visited.checkAndMarkInc(phiNode)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   898
                MicroBlock mergeBlock = nodeToBlock.get(phiNode.merge());
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   899
                assert mergeBlock != null : phiNode;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   900
                nodeToBlock.set(phiNode, mergeBlock);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   901
                AbstractMergeNode merge = phiNode.merge();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   902
                for (int i = 0; i < merge.forwardEndCount(); ++i) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   903
                    Node input = phiNode.valueAt(i);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   904
                    if (input != null && nodeToBlock.get(input) == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   905
                        stack.push(input);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   906
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   907
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   908
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   909
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   910
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   911
        private static void processStackProxy(NodeStack stack, ProxyNode proxyNode, NodeMap<MicroBlock> nodeToBlock, NodeBitMap visited) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   912
            stack.pop();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   913
            if (visited.checkAndMarkInc(proxyNode)) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   914
                nodeToBlock.set(proxyNode, nodeToBlock.get(proxyNode.proxyPoint()));
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   915
                Node input = proxyNode.value();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   916
                if (input != null && nodeToBlock.get(input) == null) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   917
                    stack.push(input);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   918
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   919
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   920
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   921
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   922
        private static void processStack(Node first, MicroBlock startBlock, NodeMap<MicroBlock> nodeToMicroBlock, NodeBitMap visited, NodeStack stack) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   923
            assert stack.isEmpty();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   924
            assert !visited.isMarked(first);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   925
            stack.push(first);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   926
            Node current = first;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   927
            while (true) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   928
                if (current instanceof PhiNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   929
                    processStackPhi(stack, (PhiNode) current, nodeToMicroBlock, visited);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   930
                } else if (current instanceof ProxyNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   931
                    processStackProxy(stack, (ProxyNode) current, nodeToMicroBlock, visited);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   932
                } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   933
                    MicroBlock currentBlock = nodeToMicroBlock.get(current);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   934
                    if (currentBlock == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   935
                        MicroBlock earliestBlock = processInputs(nodeToMicroBlock, stack, startBlock, current);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   936
                        if (earliestBlock == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   937
                            // We need to delay until inputs are processed.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   938
                        } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   939
                            // Can immediately process and pop.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   940
                            stack.pop();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   941
                            visited.checkAndMarkInc(current);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   942
                            nodeToMicroBlock.set(current, earliestBlock);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   943
                            earliestBlock.add(current);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   944
                        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   945
                    } else {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   946
                        stack.pop();
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   947
                    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   948
                }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   949
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   950
                if (stack.isEmpty()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   951
                    break;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   952
                }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
   953
                current = stack.peek();
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   954
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   955
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   956
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   957
        private static class GuardOrder {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   958
            /**
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   959
             * After an earliest schedule, this will re-sort guards to honor their
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   960
             * {@linkplain StaticDeoptimizingNode#computePriority() priority}.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   961
             *
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   962
             * Note that this only changes the order of nodes within {@linkplain MicroBlock
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   963
             * micro-blocks}, nodes will not be moved from one micro-block to another.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   964
             */
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   965
            private static void resortGuards(StructuredGraph graph, NodeMap<MicroBlock> entries, NodeStack stack) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   966
                assert stack.isEmpty();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   967
                EconomicSet<MicroBlock> blocksWithGuards = EconomicSet.create(IDENTITY);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   968
                for (GuardNode guard : graph.getNodes(GuardNode.TYPE)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   969
                    MicroBlock block = entries.get(guard);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   970
                    assert block != null : guard + "should already be scheduled to a micro-block";
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   971
                    blocksWithGuards.add(block);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   972
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   973
                assert !blocksWithGuards.isEmpty();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   974
                NodeMap<GuardPriority> priorities = graph.createNodeMap();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   975
                NodeBitMap blockNodes = graph.createNodeBitMap();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   976
                for (MicroBlock block : blocksWithGuards) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   977
                    MicroBlock newBlock = resortGuards(block, stack, blockNodes, priorities);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   978
                    assert stack.isEmpty();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   979
                    assert blockNodes.isEmpty();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   980
                    if (newBlock != null) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   981
                        assert block.getNodeCount() == newBlock.getNodeCount();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   982
                        block.head = newBlock.head;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   983
                        block.tail = newBlock.tail;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   984
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   985
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   986
            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   987
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   988
            /**
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   989
             * This resorts guards within one micro-block.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   990
             *
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   991
             * {@code stack}, {@code blockNodes} and {@code priorities} are just temporary
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   992
             * data-structures which are allocated once by the callers of this method. They should
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   993
             * be in their "initial"/"empty" state when calling this method and when it returns.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   994
             */
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   995
            private static MicroBlock resortGuards(MicroBlock block, NodeStack stack, NodeBitMap blockNodes, NodeMap<GuardPriority> priorities) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   996
                if (!propagatePriority(block, stack, priorities, blockNodes)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   997
                    return null;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   998
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
   999
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1000
                Function<GuardNode, GuardPriority> transitiveGuardPriorityGetter = priorities::get;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1001
                Comparator<GuardNode> globalGuardPriorityComparator = Comparator.comparing(transitiveGuardPriorityGetter).thenComparing(GuardNode::computePriority).thenComparingInt(Node::hashCode);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1002
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1003
                SortedSet<GuardNode> availableGuards = new TreeSet<>(globalGuardPriorityComparator);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1004
                MicroBlock newBlock = new MicroBlock(block.getId());
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1005
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1006
                NodeBitMap sorted = blockNodes;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1007
                sorted.invert();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1008
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1009
                for (NodeEntry e = block.head; e != null; e = e.next) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1010
                    checkIfAvailable(e.node, stack, sorted, newBlock, availableGuards, false);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1011
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1012
                do {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1013
                    while (!stack.isEmpty()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1014
                        checkIfAvailable(stack.pop(), stack, sorted, newBlock, availableGuards, true);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1015
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1016
                    Iterator<GuardNode> iterator = availableGuards.iterator();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1017
                    if (iterator.hasNext()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1018
                        addNodeToResort(iterator.next(), stack, sorted, newBlock, true);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1019
                        iterator.remove();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1020
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1021
                } while (!stack.isEmpty() || !availableGuards.isEmpty());
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1022
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1023
                blockNodes.clearAll();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1024
                return newBlock;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1025
            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1026
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1027
            /**
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1028
             * This checks if {@code n} can be scheduled, if it is the case, it schedules it now by
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1029
             * calling {@link #addNodeToResort(Node, NodeStack, NodeBitMap, MicroBlock, boolean)}.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1030
             */
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1031
            private static void checkIfAvailable(Node n, NodeStack stack, NodeBitMap sorted, Instance.MicroBlock newBlock, SortedSet<GuardNode> availableGuardNodes, boolean pushUsages) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1032
                if (sorted.isMarked(n)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1033
                    return;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1034
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1035
                for (Node in : n.inputs()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1036
                    if (!sorted.isMarked(in)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1037
                        return;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1038
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1039
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1040
                if (n instanceof GuardNode) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1041
                    availableGuardNodes.add((GuardNode) n);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1042
                } else {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1043
                    addNodeToResort(n, stack, sorted, newBlock, pushUsages);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1044
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1045
            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1046
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1047
            /**
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1048
             * Add a node to the re-sorted micro-block. This also pushes nodes that need to be
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1049
             * (re-)examined on the stack.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1050
             */
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1051
            private static void addNodeToResort(Node n, NodeStack stack, NodeBitMap sorted, MicroBlock newBlock, boolean pushUsages) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1052
                sorted.mark(n);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1053
                newBlock.add(n);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1054
                if (pushUsages) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1055
                    for (Node u : n.usages()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1056
                        if (!sorted.isMarked(u)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1057
                            stack.push(u);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1058
                        }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1059
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1060
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1061
            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1062
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1063
            /**
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1064
             * This fills in a map of transitive priorities ({@code priorities}). It also marks the
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1065
             * nodes from this micro-block in {@code blockNodes}.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1066
             *
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1067
             * The transitive priority of a guard is the highest of its priority and the priority of
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1068
             * the guards that depend on it (transitively).
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1069
             *
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1070
             * This method returns {@code false} if no re-ordering is necessary in this micro-block.
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1071
             */
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1072
            private static boolean propagatePriority(MicroBlock block, NodeStack stack, NodeMap<GuardPriority> priorities, NodeBitMap blockNodes) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1073
                assert stack.isEmpty();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1074
                assert blockNodes.isEmpty();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1075
                GuardPriority lowestPriority = GuardPriority.highest();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1076
                for (NodeEntry e = block.head; e != null; e = e.next) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1077
                    blockNodes.mark(e.node);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1078
                    if (e.node instanceof GuardNode) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1079
                        GuardNode guard = (GuardNode) e.node;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1080
                        GuardPriority priority = guard.computePriority();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1081
                        if (lowestPriority != null) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1082
                            if (priority.isLowerPriorityThan(lowestPriority)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1083
                                lowestPriority = priority;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1084
                            } else if (priority.isHigherPriorityThan(lowestPriority)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1085
                                lowestPriority = null;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1086
                            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1087
                        }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1088
                        stack.push(guard);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1089
                        priorities.set(guard, priority);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1090
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1091
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1092
                if (lowestPriority != null) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1093
                    stack.clear();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1094
                    blockNodes.clearAll();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1095
                    return false;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1096
                }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1097
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1098
                do {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1099
                    Node current = stack.pop();
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1100
                    assert blockNodes.isMarked(current);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1101
                    GuardPriority priority = priorities.get(current);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1102
                    for (Node input : current.inputs()) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1103
                        if (!blockNodes.isMarked(input)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1104
                            continue;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1105
                        }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1106
                        GuardPriority inputPriority = priorities.get(input);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1107
                        if (inputPriority == null || inputPriority.isLowerPriorityThan(priority)) {
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1108
                            priorities.set(input, priority);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1109
                            stack.push(input);
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1110
                        }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1111
                    }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1112
                } while (!stack.isEmpty());
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1113
                return true;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1114
            }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1115
        }
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1116
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1117
        /**
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1118
         * Processes the inputs of given block. Pushes unprocessed inputs onto the stack. Returns
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1119
         * null if there were still unprocessed inputs, otherwise returns the earliest block given
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1120
         * node can be scheduled in.
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1121
         */
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1122
        private static MicroBlock processInputs(NodeMap<MicroBlock> nodeToBlock, NodeStack stack, MicroBlock startBlock, Node current) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1123
            if (current.getNodeClass().isLeafNode()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1124
                return startBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1125
            }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1126
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1127
            MicroBlock earliestBlock = startBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1128
            for (Node input : current.inputs()) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1129
                MicroBlock inputBlock = nodeToBlock.get(input);
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1130
                if (inputBlock == null) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1131
                    earliestBlock = null;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1132
                    stack.push(input);
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
  1133
                } else if (earliestBlock != null && inputBlock.getId() > earliestBlock.getId()) {
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1134
                    earliestBlock = inputBlock;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1135
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1136
            }
46344
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1137
            return earliestBlock;
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1138
        }
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1139
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1140
        private static boolean isFixedEnd(FixedNode endNode) {
694c102fd8ed 8177046: Update Graal
iveresov
parents: 43972
diff changeset
  1141
            return endNode instanceof ControlSplitNode || endNode instanceof ControlSinkNode || endNode instanceof AbstractEndNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1142
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1143
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1144
        public String printScheduleHelper(String desc) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1145
            Formatter buf = new Formatter();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1146
            buf.format("=== %s / %s ===%n", getCFG().getStartBlock().getBeginNode().graph(), desc);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1147
            for (Block b : getCFG().getBlocks()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1148
                buf.format("==== b: %s (loopDepth: %s). ", b, b.getLoopDepth());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1149
                buf.format("dom: %s. ", b.getDominator());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1150
                buf.format("preds: %s. ", Arrays.toString(b.getPredecessors()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1151
                buf.format("succs: %s ====%n", Arrays.toString(b.getSuccessors()));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1152
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1153
                if (blockToNodesMap.get(b) != null) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1154
                    for (Node n : nodesFor(b)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1155
                        printNode(n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1156
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1157
                } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1158
                    for (Node n : b.getNodes()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1159
                        printNode(n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1160
                    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1161
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1162
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1163
            buf.format("%n");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1164
            return buf.toString();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1165
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1166
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1167
        private static void printNode(Node n) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1168
            Formatter buf = new Formatter();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1169
            buf.format("%s", n);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1170
            if (n instanceof MemoryCheckpoint.Single) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1171
                buf.format(" // kills %s", ((MemoryCheckpoint.Single) n).getLocationIdentity());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1172
            } else if (n instanceof MemoryCheckpoint.Multi) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1173
                buf.format(" // kills ");
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1174
                for (LocationIdentity locid : ((MemoryCheckpoint.Multi) n).getLocationIdentities()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1175
                    buf.format("%s, ", locid);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1176
                }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1177
            } else if (n instanceof FloatingReadNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1178
                FloatingReadNode frn = (FloatingReadNode) n;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1179
                buf.format(" // from %s", frn.getLocationIdentity());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1180
                buf.format(", lastAccess: %s", frn.getLastLocationAccess());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1181
                buf.format(", address: %s", frn.getAddress());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1182
            } else if (n instanceof GuardNode) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1183
                buf.format(", anchor: %s", ((GuardNode) n).getAnchor());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1184
            }
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46551
diff changeset
  1185
            n.getDebug().log("%s", buf);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1186
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1187
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1188
        public ControlFlowGraph getCFG() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1189
            return cfg;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1190
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1191
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1192
        /**
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1193
         * Gets the nodes in a given block.
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1194
         */
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1195
        public List<Node> nodesFor(Block block) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1196
            return blockToNodesMap.get(block);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1197
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1198
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1199
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
  1200
}