hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/aot/ReplaceConstantNodesPhase.java
author iveresov
Tue, 13 Jun 2017 09:19:35 -0700
changeset 46536 79d8dffda212
parent 43972 1ade39b8381b
child 46566 231c681fa946
permissions -rw-r--r--
8182018: 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) 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.hotspot.phases.aot;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    24
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    25
import static org.graalvm.compiler.core.common.cfg.AbstractControlFlowGraph.strictlyDominates;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    26
import static org.graalvm.compiler.hotspot.nodes.aot.LoadMethodCountersNode.getLoadMethodCountersNodes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    27
import static org.graalvm.compiler.nodes.ConstantNode.getConstantNodes;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    28
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    29
import java.util.HashSet;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    30
import java.util.List;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    31
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    32
import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    33
import jdk.vm.ci.hotspot.HotSpotObjectConstant;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    34
import jdk.vm.ci.hotspot.HotSpotResolvedJavaType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    35
import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    36
import jdk.vm.ci.meta.Constant;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    37
import jdk.vm.ci.meta.ConstantReflectionProvider;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    38
import jdk.vm.ci.meta.ResolvedJavaType;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    39
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    40
import org.graalvm.compiler.core.common.cfg.BlockMap;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    41
import org.graalvm.compiler.core.common.type.ObjectStamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.core.common.type.Stamp;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    43
import org.graalvm.compiler.core.common.type.StampFactory;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    44
import org.graalvm.compiler.debug.GraalError;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    45
import org.graalvm.compiler.graph.Node;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    46
import org.graalvm.compiler.graph.NodeMap;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    47
import org.graalvm.compiler.hotspot.FingerprintUtil;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    48
import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    49
import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    50
import org.graalvm.compiler.hotspot.nodes.aot.LoadConstantIndirectlyFixedNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    51
import org.graalvm.compiler.hotspot.nodes.aot.LoadConstantIndirectlyNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    52
import org.graalvm.compiler.hotspot.nodes.aot.LoadMethodCountersNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    53
import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    54
import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    55
import org.graalvm.compiler.nodes.ConstantNode;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    56
import org.graalvm.compiler.nodes.FixedWithNextNode;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    57
import org.graalvm.compiler.nodes.StructuredGraph;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    58
import org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    59
import org.graalvm.compiler.nodes.ValueNode;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    60
import org.graalvm.compiler.nodes.cfg.Block;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    61
import org.graalvm.compiler.phases.BasePhase;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    62
import org.graalvm.compiler.phases.schedule.SchedulePhase;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    63
import org.graalvm.compiler.phases.schedule.SchedulePhase.SchedulingStrategy;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    64
import org.graalvm.compiler.phases.tiers.PhaseContext;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    65
import org.graalvm.util.EconomicMap;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    66
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    67
public class ReplaceConstantNodesPhase extends BasePhase<PhaseContext> {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    68
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    69
    private static final HashSet<Class<?>> builtIns = new HashSet<>();
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
    70
    private final boolean verifyFingerprints;
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    71
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    72
    static {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    73
        builtIns.add(Boolean.class);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    74
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    75
        Class<?> characterCacheClass = Character.class.getDeclaredClasses()[0];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    76
        assert "java.lang.Character$CharacterCache".equals(characterCacheClass.getName());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    77
        builtIns.add(characterCacheClass);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    78
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    79
        Class<?> byteCacheClass = Byte.class.getDeclaredClasses()[0];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    80
        assert "java.lang.Byte$ByteCache".equals(byteCacheClass.getName());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    81
        builtIns.add(byteCacheClass);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    82
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    83
        Class<?> shortCacheClass = Short.class.getDeclaredClasses()[0];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    84
        assert "java.lang.Short$ShortCache".equals(shortCacheClass.getName());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    85
        builtIns.add(shortCacheClass);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    86
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    87
        Class<?> integerCacheClass = Integer.class.getDeclaredClasses()[0];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    88
        assert "java.lang.Integer$IntegerCache".equals(integerCacheClass.getName());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    89
        builtIns.add(integerCacheClass);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    90
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    91
        Class<?> longCacheClass = Long.class.getDeclaredClasses()[0];
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    92
        assert "java.lang.Long$LongCache".equals(longCacheClass.getName());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    93
        builtIns.add(longCacheClass);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    94
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    95
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    96
    private static boolean isReplacementNode(Node n) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    97
        // @formatter:off
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    98
        return n instanceof LoadConstantIndirectlyNode      ||
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
    99
               n instanceof LoadConstantIndirectlyFixedNode ||
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   100
               n instanceof ResolveConstantNode             ||
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   101
               n instanceof InitializeKlassNode;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   102
        // @formatter:on
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   103
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   104
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   105
    private static boolean anyUsagesNeedReplacement(ConstantNode node) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   106
        return node.usages().filter(n -> !isReplacementNode(n)).isNotEmpty();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   107
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   108
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   109
    private static boolean anyUsagesNeedReplacement(LoadMethodCountersNode node) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   110
        return node.usages().filter(n -> !(n instanceof ResolveMethodAndLoadCountersNode)).isNotEmpty();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   111
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   112
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   113
    private static boolean checkForBadFingerprint(HotSpotResolvedJavaType type) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   114
        if (type.isArray()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   115
            if (type.getElementalType().isPrimitive()) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   116
                return false;
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
            return FingerprintUtil.getFingerprint((HotSpotResolvedObjectType) (type.getElementalType())) == 0;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   119
        }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   120
        return FingerprintUtil.getFingerprint((HotSpotResolvedObjectType) type) == 0;
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
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   123
    /**
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   124
     * Replace {@link ConstantNode} containing a {@link HotSpotResolvedJavaType} with indirection.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   125
     *
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   126
     * @param graph
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   127
     * @param node {@link ConstantNode} containing a {@link HotSpotResolvedJavaType} that needs
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   128
     *            resolution.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   129
     */
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   130
    private void handleHotSpotMetaspaceConstant(StructuredGraph graph, ConstantNode node) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   131
        HotSpotMetaspaceConstant metaspaceConstant = (HotSpotMetaspaceConstant) node.asConstant();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   132
        HotSpotResolvedJavaType type = (HotSpotResolvedJavaType) metaspaceConstant.asResolvedJavaType();
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
        if (type != null) {
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   135
            if (verifyFingerprints && checkForBadFingerprint(type)) {
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   136
                throw new GraalError("Type with bad fingerprint: " + type);
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
            assert !metaspaceConstant.isCompressed() : "No support for replacing compressed metaspace constants";
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   139
            replaceWithInitialization(graph, node);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   140
            if (anyUsagesNeedReplacement(node)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   141
                replaceWithResolution(graph, node);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   142
            }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   143
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   144
            throw new GraalError("Unsupported metaspace constant type: " + type);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   145
        }
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
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   148
    /**
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   149
     * Find the lowest dominating {@link FixedWithNextNode} before given node.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   150
     *
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   151
     * @param graph
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   152
     * @param node
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   153
     * @return the last {@link FixedWithNextNode} that is scheduled before node.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   154
     */
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   155
    private static FixedWithNextNode findFixedWithNextBefore(StructuredGraph graph, Node node) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   156
        ScheduleResult schedule = graph.getLastSchedule();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   157
        NodeMap<Block> nodeToBlock = schedule.getNodeToBlockMap();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   158
        BlockMap<List<Node>> blockToNodes = schedule.getBlockToNodesMap();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   159
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   160
        Block block = nodeToBlock.get(node);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   161
        FixedWithNextNode result = null;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   162
        for (Node n : blockToNodes.get(block)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   163
            if (n instanceof FixedWithNextNode) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   164
                result = (FixedWithNextNode) n;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   165
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   166
            if (n.equals(node)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   167
                break;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   168
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   169
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   170
        assert result != null;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   171
        return result;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   172
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   173
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   174
    /**
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   175
     * Try to find dominating {@link InitializeKlassNode} that can be reused.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   176
     *
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   177
     * @param graph
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   178
     * @param node {@link ConstantNode} containing a {@link HotSpotResolvedJavaType} that needs
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   179
     *            resolution.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   180
     */
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   181
    private static void replaceWithInitialization(StructuredGraph graph, ConstantNode node) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   182
        ScheduleResult schedule = graph.getLastSchedule();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   183
        NodeMap<Block> nodeToBlock = schedule.getNodeToBlockMap();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   184
        BlockMap<List<Node>> blockToNodes = schedule.getBlockToNodesMap();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   185
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   186
        EconomicMap<Block, Node> blockToInit = EconomicMap.create();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   187
        for (Node n : node.usages().filter(InitializeKlassNode.class)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   188
            blockToInit.put(nodeToBlock.get(n), n);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   189
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   190
        for (Node use : node.usages().filter(n -> !isReplacementNode(n)).snapshot()) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   191
            boolean replaced = false;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   192
            Block b = nodeToBlock.get(use);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   193
            InitializeKlassNode i = (InitializeKlassNode) blockToInit.get(b);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   194
            if (i != null) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   195
                // There is an initialization in the same block as the use, look if the use is
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   196
                // scheduled after it.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   197
                for (Node n : blockToNodes.get(b)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   198
                    if (n.equals(use)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   199
                        // Usage is before initialization, can't use it
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   200
                        break;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   201
                    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   202
                    if (n.equals(i)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   203
                        use.replaceFirstInput(node, i);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   204
                        replaced = true;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   205
                        break;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   206
                    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   207
                }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   208
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   209
            if (!replaced) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   210
                // Look for dominating blocks that have initializations
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   211
                for (Block d : blockToInit.getKeys()) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   212
                    if (strictlyDominates(d, b)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   213
                        use.replaceFirstInput(node, blockToInit.get(d));
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   214
                        break;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   215
                    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   216
                }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   217
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   218
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   219
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   220
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   221
    /**
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   222
     * Replace the uses of a constant with either {@link LoadConstantIndirectlyNode} or
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   223
     * {@link ResolveConstantNode}.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   224
     *
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   225
     * @param graph
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   226
     * @param node {@link ConstantNode} containing a {@link HotSpotResolvedJavaType} that needs
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   227
     *            resolution.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   228
     */
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   229
    private static void replaceWithResolution(StructuredGraph graph, ConstantNode node) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   230
        HotSpotMetaspaceConstant metaspaceConstant = (HotSpotMetaspaceConstant) node.asConstant();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   231
        HotSpotResolvedJavaType type = (HotSpotResolvedJavaType) metaspaceConstant.asResolvedJavaType();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   232
        ResolvedJavaType topMethodHolder = graph.method().getDeclaringClass();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   233
        ValueNode replacement;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   234
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   235
        if (type.isArray() && type.getComponentType().isPrimitive()) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   236
            // Special case for primitive arrays. The AOT runtime pre-resolves them, so we may
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   237
            // omit the resolution call.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   238
            replacement = graph.addOrUnique(new LoadConstantIndirectlyNode(node));
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   239
        } else if (type.equals(topMethodHolder) || (type.isAssignableFrom(topMethodHolder) && !type.isInterface())) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   240
            // If it's a supertype of or the same class that declares the top method, we are
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   241
            // guaranteed to have it resolved already. If it's an interface, we just test for
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   242
            // equality.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   243
            replacement = graph.addOrUnique(new LoadConstantIndirectlyNode(node));
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   244
        } else {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   245
            FixedWithNextNode fixedReplacement;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   246
            if (builtIns.contains(type.mirror())) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   247
                // Special case of klass constants that come from {@link BoxingSnippets}.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   248
                fixedReplacement = graph.add(new ResolveConstantNode(node, HotSpotConstantLoadAction.INITIALIZE));
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   249
            } else {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   250
                fixedReplacement = graph.add(new ResolveConstantNode(node));
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   251
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   252
            graph.addAfterFixed(findFixedWithNextBefore(graph, node), fixedReplacement);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   253
            replacement = fixedReplacement;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   254
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   255
        node.replaceAtUsages(replacement, n -> !isReplacementNode(n));
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   256
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   257
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   258
    /**
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   259
     * Replace an object constant with an indirect load {@link ResolveConstantNode}. Currently we
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   260
     * support only strings.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   261
     *
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   262
     * @param graph
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   263
     * @param node {@link ConstantNode} containing a {@link HotSpotObjectConstant} that needs
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   264
     *            resolution.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   265
     */
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   266
    private static void handleHotSpotObjectConstant(StructuredGraph graph, ConstantNode node) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   267
        HotSpotObjectConstant constant = (HotSpotObjectConstant) node.asJavaConstant();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   268
        HotSpotResolvedJavaType type = (HotSpotResolvedJavaType) constant.getType();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   269
        if (type.mirror().equals(String.class)) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   270
            assert !constant.isCompressed() : "No support for replacing compressed oop constants";
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   271
            FixedWithNextNode replacement = graph.add(new ResolveConstantNode(node));
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   272
            graph.addAfterFixed(findFixedWithNextBefore(graph, node), replacement);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   273
            node.replaceAtUsages(replacement, n -> !(n instanceof ResolveConstantNode));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   274
        } else {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   275
            throw new GraalError("Unsupported object constant type: " + type);
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   276
        }
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
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   279
    /**
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   280
     * Replace {@link LoadMethodCountersNode} with indirect load
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   281
     * {@link ResolveMethodAndLoadCountersNode}, expose a klass constant of the holder.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   282
     *
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   283
     * @param graph
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   284
     * @param node
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   285
     * @param context
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   286
     */
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   287
    private static void handleLoadMethodCounters(StructuredGraph graph, LoadMethodCountersNode node, PhaseContext context) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   288
        ResolvedJavaType type = node.getMethod().getDeclaringClass();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   289
        Stamp hubStamp = context.getStampProvider().createHubStamp((ObjectStamp) StampFactory.objectNonNull());
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   290
        ConstantReflectionProvider constantReflection = context.getConstantReflection();
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   291
        ConstantNode klassHint = ConstantNode.forConstant(hubStamp, constantReflection.asObjectHub(type), context.getMetaAccess(), graph);
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   292
        FixedWithNextNode replacement = graph.add(new ResolveMethodAndLoadCountersNode(node.getMethod(), klassHint));
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   293
        graph.addAfterFixed(findFixedWithNextBefore(graph, node), replacement);
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   294
        node.replaceAtUsages(replacement, n -> !(n instanceof ResolveMethodAndLoadCountersNode));
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   295
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   296
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   297
    /**
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   298
     * Replace {@link LoadMethodCountersNode} with {@link ResolveMethodAndLoadCountersNode}, expose
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   299
     * klass constants.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   300
     *
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   301
     * @param graph
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   302
     * @param context
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   303
     */
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   304
    private static void replaceLoadMethodCounters(StructuredGraph graph, PhaseContext context) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   305
        new SchedulePhase(SchedulingStrategy.LATEST_OUT_OF_LOOPS, true).apply(graph, false);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   306
        for (LoadMethodCountersNode node : getLoadMethodCountersNodes(graph)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   307
            if (anyUsagesNeedReplacement(node)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   308
                handleLoadMethodCounters(graph, node, context);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   309
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   310
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   311
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   312
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   313
    /**
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   314
     * Replace object and klass constants with resolution nodes or reuse preceding initializations.
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   315
     *
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   316
     * @param graph
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   317
     */
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   318
    private void replaceKlassesAndObjects(StructuredGraph graph) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   319
        new SchedulePhase(SchedulingStrategy.LATEST_OUT_OF_LOOPS, true).apply(graph, false);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   320
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   321
        for (ConstantNode node : getConstantNodes(graph)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   322
            Constant constant = node.asConstant();
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   323
            if (constant instanceof HotSpotMetaspaceConstant && anyUsagesNeedReplacement(node)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   324
                handleHotSpotMetaspaceConstant(graph, node);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   325
            } else if (constant instanceof HotSpotObjectConstant && anyUsagesNeedReplacement(node)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   326
                handleHotSpotObjectConstant(graph, node);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   327
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   328
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   329
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   330
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   331
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   332
    protected void run(StructuredGraph graph, PhaseContext context) {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   333
        // Replace LoadMethodCountersNode with ResolveMethodAndLoadCountersNode, expose klass
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   334
        // constants.
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   335
        replaceLoadMethodCounters(graph, context);
43972
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
        // Replace object and klass constants (including the ones added in the previous pass) with
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   338
        // resolution nodes.
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   339
        replaceKlassesAndObjects(graph);
43972
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
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   342
    @Override
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   343
    public boolean checkContract() {
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   344
        return false;
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   345
    }
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   346
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   347
    public ReplaceConstantNodesPhase() {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   348
        this(true);
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   349
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   350
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   351
    public ReplaceConstantNodesPhase(boolean verifyFingerprints) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   352
        this.verifyFingerprints = verifyFingerprints;
79d8dffda212 8182018: Update Graal
iveresov
parents: 43972
diff changeset
   353
    }
43972
1ade39b8381b 8174879: Rename jdk.vm.ci to jdk.internal.vm.ci
kvn
parents:
diff changeset
   354
}