annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java @ 16841:cbd42807a31f

moved NodeInfo and friends into separate com.oracle.graal.nodeinfo project so that annotation processor can be applied to the base Node class
author Doug Simon <doug.simon@oracle.com>
date Fri, 15 Aug 2014 11:34:38 +0200
parents 173da8c3095d
children f90dcdbbb75e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
1 /*
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
4 *
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
8 *
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
13 * accompanied this code).
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
14 *
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
18 *
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
21 * questions.
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
22 */
6526
ee651c726397 split phases out of graal.phases project into graal.phases.common project
Doug Simon <doug.simon@oracle.com>
parents: 6525
diff changeset
23 package com.oracle.graal.phases.common;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
24
5510
426c605c9d3c Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5507
diff changeset
25 import com.oracle.graal.api.code.*;
5507
dc71b06d09f8 Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5501
diff changeset
26 import com.oracle.graal.api.meta.*;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
27 import com.oracle.graal.debug.*;
13197
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
28 import com.oracle.graal.debug.Debug.Scope;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
29 import com.oracle.graal.graph.*;
16241
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
30 import com.oracle.graal.graph.Graph.*;
11881
da9db8331658 moved Canonicalizable and Simplifiable to the com.oracle.graal.graph project (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11879
diff changeset
31 import com.oracle.graal.graph.spi.*;
16841
cbd42807a31f moved NodeInfo and friends into separate com.oracle.graal.nodeinfo project so that annotation processor can be applied to the base Node class
Doug Simon <doug.simon@oracle.com>
parents: 16587
diff changeset
32 import com.oracle.graal.nodeinfo.*;
5060
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
33 import com.oracle.graal.nodes.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
34 import com.oracle.graal.nodes.calc.*;
4ed4295ce15f Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5059
diff changeset
35 import com.oracle.graal.nodes.util.*;
6526
ee651c726397 split phases out of graal.phases project into graal.phases.common project
Doug Simon <doug.simon@oracle.com>
parents: 6525
diff changeset
36 import com.oracle.graal.phases.*;
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
37 import com.oracle.graal.phases.tiers.*;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
38
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
39 public class CanonicalizerPhase extends BasePhase<PhaseContext> {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7522
diff changeset
40
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
41 private static final int MAX_ITERATION_PER_NODE = 10;
5134
4eb9895d9afe Refactoring of the debug framework. Move compiler thread implementation to its own file.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5061
diff changeset
42 private static final DebugMetric METRIC_CANONICALIZED_NODES = Debug.metric("CanonicalizedNodes");
11586
9652640fae42 tightened option verifier to check all class initializers in the hierarchy of a class that declares at least one @Option
Doug Simon <doug.simon@oracle.com>
parents: 11575
diff changeset
43 private static final DebugMetric METRIC_PROCESSED_NODES = Debug.metric("ProcessedNodes");
5134
4eb9895d9afe Refactoring of the debug framework. Move compiler thread implementation to its own file.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5061
diff changeset
44 private static final DebugMetric METRIC_CANONICALIZATION_CONSIDERED_NODES = Debug.metric("CanonicalizationConsideredNodes");
5657
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5558
diff changeset
45 private static final DebugMetric METRIC_INFER_STAMP_CALLED = Debug.metric("InferStampCalled");
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5558
diff changeset
46 private static final DebugMetric METRIC_STAMP_CHANGED = Debug.metric("StampChanged");
5134
4eb9895d9afe Refactoring of the debug framework. Move compiler thread implementation to its own file.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 5061
diff changeset
47 private static final DebugMetric METRIC_SIMPLIFICATION_CONSIDERED_NODES = Debug.metric("SimplificationConsideredNodes");
11586
9652640fae42 tightened option verifier to check all class initializers in the hierarchy of a class that declares at least one @Option
Doug Simon <doug.simon@oracle.com>
parents: 11575
diff changeset
48 private static final DebugMetric METRIC_GLOBAL_VALUE_NUMBERING_HITS = Debug.metric("GlobalValueNumberingHits");
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
49
9908
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
50 private final boolean canonicalizeReads;
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
51 private final CustomCanonicalizer customCanonicalizer;
9908
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
52
16587
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
53 public static abstract class CustomCanonicalizer {
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7522
diff changeset
54
16587
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
55 public Node canonicalize(Node node) {
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
56 return node;
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
57 }
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
58
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
59 @SuppressWarnings("unused")
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
60 public void simplify(Node node, SimplifierTool tool) {
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
61 }
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
62 }
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
63
9908
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
64 public CanonicalizerPhase(boolean canonicalizeReads) {
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
65 this(canonicalizeReads, null);
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
66 }
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
67
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
68 public CanonicalizerPhase(boolean canonicalizeReads, CustomCanonicalizer customCanonicalizer) {
9908
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
69 this.canonicalizeReads = canonicalizeReads;
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
70 this.customCanonicalizer = customCanonicalizer;
9908
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
71 }
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
72
16264
df2fd3857607 getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16257
diff changeset
73 public boolean getCanonicalizeReads() {
df2fd3857607 getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16257
diff changeset
74 return canonicalizeReads;
df2fd3857607 getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16257
diff changeset
75 }
df2fd3857607 getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16257
diff changeset
76
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
77 @Override
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
78 protected void run(StructuredGraph graph, PhaseContext context) {
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
79 new Instance(context, canonicalizeReads, customCanonicalizer).run(graph);
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
80 }
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
81
11575
00672122f256 Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents: 11568
diff changeset
82 /**
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
83 * @param newNodesMark only the {@linkplain Graph#getNewNodes(Mark) new nodes} specified by this
11575
00672122f256 Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents: 11568
diff changeset
84 * mark are processed
00672122f256 Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents: 11568
diff changeset
85 */
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
86 public void applyIncremental(StructuredGraph graph, PhaseContext context, Mark newNodesMark) {
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
87 applyIncremental(graph, context, newNodesMark, true);
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
88 }
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
89
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
90 public void applyIncremental(StructuredGraph graph, PhaseContext context, Mark newNodesMark, boolean dumpGraph) {
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
91 new Instance(context, canonicalizeReads, newNodesMark, customCanonicalizer).apply(graph, dumpGraph);
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
92 }
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
93
11575
00672122f256 Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents: 11568
diff changeset
94 /**
00672122f256 Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents: 11568
diff changeset
95 * @param workingSet the initial working set of nodes on which the canonicalizer works, should
00672122f256 Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents: 11568
diff changeset
96 * be an auto-grow node bitmap
00672122f256 Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents: 11568
diff changeset
97 */
16553
c9d3d0964adb proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16337
diff changeset
98 public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable<? extends Node> workingSet) {
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
99 applyIncremental(graph, context, workingSet, true);
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
100 }
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
101
16553
c9d3d0964adb proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16337
diff changeset
102 public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable<? extends Node> workingSet, boolean dumpGraph) {
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
103 new Instance(context, canonicalizeReads, workingSet, customCanonicalizer).apply(graph, dumpGraph);
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
104 }
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
105
16553
c9d3d0964adb proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16337
diff changeset
106 public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable<? extends Node> workingSet, Mark newNodesMark) {
11566
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
107 applyIncremental(graph, context, workingSet, newNodesMark, true);
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
108 }
aa9ce8d56771 New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents: 11565
diff changeset
109
16553
c9d3d0964adb proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16337
diff changeset
110 public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable<? extends Node> workingSet, Mark newNodesMark, boolean dumpGraph) {
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
111 new Instance(context, canonicalizeReads, workingSet, newNodesMark, customCanonicalizer).apply(graph, dumpGraph);
5419
3c16d338888e Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5380
diff changeset
112 }
3c16d338888e Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5380
diff changeset
113
11575
00672122f256 Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents: 11568
diff changeset
114 private static final class Instance extends Phase {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
115
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
116 private final Mark newNodesMark;
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
117 private final PhaseContext context;
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
118 private final CustomCanonicalizer customCanonicalizer;
16553
c9d3d0964adb proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16337
diff changeset
119 private final Iterable<? extends Node> initWorkingSet;
9908
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
120 private final boolean canonicalizeReads;
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
121
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
122 private NodeWorkList workList;
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
123 private Tool tool;
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
124
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
125 private Instance(PhaseContext context, boolean canonicalizeReads, CustomCanonicalizer customCanonicalizer) {
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
126 this(context, canonicalizeReads, null, null, customCanonicalizer);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
127 }
5419
3c16d338888e Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5380
diff changeset
128
16553
c9d3d0964adb proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16337
diff changeset
129 private Instance(PhaseContext context, boolean canonicalizeReads, Iterable<? extends Node> workingSet, CustomCanonicalizer customCanonicalizer) {
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
130 this(context, canonicalizeReads, workingSet, null, customCanonicalizer);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
131 }
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
132
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
133 private Instance(PhaseContext context, boolean canonicalizeReads, Mark newNodesMark, CustomCanonicalizer customCanonicalizer) {
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
134 this(context, canonicalizeReads, null, newNodesMark, customCanonicalizer);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
135 }
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
136
16553
c9d3d0964adb proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16337
diff changeset
137 private Instance(PhaseContext context, boolean canonicalizeReads, Iterable<? extends Node> workingSet, Mark newNodesMark, CustomCanonicalizer customCanonicalizer) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
138 super("Canonicalizer");
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
139 this.newNodesMark = newNodesMark;
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
140 this.context = context;
9908
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
141 this.canonicalizeReads = canonicalizeReads;
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
142 this.customCanonicalizer = customCanonicalizer;
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
143 this.initWorkingSet = workingSet;
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
144 }
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
145
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
146 @Override
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
147 protected void run(StructuredGraph graph) {
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
148 boolean wholeGraph = newNodesMark == null || newNodesMark.isStart();
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
149 if (initWorkingSet == null) {
15956
edc33e8715d5 NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15866
diff changeset
150 workList = graph.createIterativeNodeWorkList(wholeGraph, MAX_ITERATION_PER_NODE);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
151 } else {
15956
edc33e8715d5 NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15866
diff changeset
152 workList = graph.createIterativeNodeWorkList(false, MAX_ITERATION_PER_NODE);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
153 workList.addAll(initWorkingSet);
5419
3c16d338888e Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5380
diff changeset
154 }
12686
ca8ab182026f abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents: 12570
diff changeset
155 if (!wholeGraph) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
156 workList.addAll(graph.getNewNodes(newNodesMark));
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
157 }
9965
6c13b749d3f9 Tool: make class non-static
Bernhard Urban <bernhard.urban@jku.at>
parents: 9916
diff changeset
158 tool = new Tool();
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
159 processWorkSet(graph);
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
160 }
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
161
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
162 private void processWorkSet(StructuredGraph graph) {
16241
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
163 NodeEventListener listener = new NodeEventListener() {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
164
16241
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
165 public void nodeAdded(Node node) {
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
166 workList.add(node);
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
167 }
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
168
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
169 public void inputChanged(Node node) {
15956
edc33e8715d5 NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15866
diff changeset
170 workList.add(node);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
171 }
16241
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
172
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
173 public void usagesDroppedToZero(Node node) {
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
174 workList.add(node);
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
175 }
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
176
16241
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
177 };
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
178 try (NodeEventScope nes = graph.trackNodeEvents(listener)) {
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
179 for (Node n : workList) {
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
180 processNode(n);
c6ebc1997a55 added listener for nodes being added to a graph; consolidated all node event listeners into new NodeEventListener interface and made registering such listeners work in a try-with-resources statement so that de-registration is automatic
Doug Simon <doug.simon@oracle.com>
parents: 16239
diff changeset
181 }
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
182 }
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
183 }
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
184
11266
2290f6b53429 Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11265
diff changeset
185 private void processNode(Node node) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
186 if (node.isAlive()) {
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
187 METRIC_PROCESSED_NODES.increment();
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
188
11882
51059863da73 replace instanceof type tests for Canonicalizable and Simplifiable with extra boolean properties in NodeClass (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11881
diff changeset
189 NodeClass nodeClass = node.getNodeClass();
51059863da73 replace instanceof type tests for Canonicalizable and Simplifiable with extra boolean properties in NodeClass (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11881
diff changeset
190 if (tryGlobalValueNumbering(node, nodeClass)) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
191 return;
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
192 }
11266
2290f6b53429 Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11265
diff changeset
193 StructuredGraph graph = (StructuredGraph) node.graph();
15387
fd435374bb93 moved tryKillUnused to GraphUtil
Miguel Garcia <miguel.m.garcia@oracle.com>
parents: 14707
diff changeset
194 if (!GraphUtil.tryKillUnused(node)) {
11882
51059863da73 replace instanceof type tests for Canonicalizable and Simplifiable with extra boolean properties in NodeClass (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11881
diff changeset
195 if (!tryCanonicalize(node, nodeClass)) {
11267
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
196 if (node instanceof ValueNode) {
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
197 ValueNode valueNode = (ValueNode) node;
11565
e231671f39d0 Try constant folding in canonicalizer even if tryInferStamp didn't change anything.
Roland Schatz <roland.schatz@oracle.com>
parents: 11267
diff changeset
198 boolean improvedStamp = tryInferStamp(valueNode);
e231671f39d0 Try constant folding in canonicalizer even if tryInferStamp didn't change anything.
Roland Schatz <roland.schatz@oracle.com>
parents: 11267
diff changeset
199 Constant constant = valueNode.stamp().asConstant();
e231671f39d0 Try constant folding in canonicalizer even if tryInferStamp didn't change anything.
Roland Schatz <roland.schatz@oracle.com>
parents: 11267
diff changeset
200 if (constant != null && !(node instanceof ConstantNode)) {
15592
07ca8c86d31c CanonicalizerPhase, on constant stamp, only replace at value usages.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15530
diff changeset
201 valueNode.replaceAtUsages(InputType.Value, ConstantNode.forConstant(valueNode.stamp(), constant, context.getMetaAccess(), graph));
15530
a51d48ac96d3 Fix bug in CanonicalizerPhase that could remove fixed nodes with side effects in a corner case.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 15417
diff changeset
202 GraphUtil.tryKillUnused(valueNode);
11565
e231671f39d0 Try constant folding in canonicalizer even if tryInferStamp didn't change anything.
Roland Schatz <roland.schatz@oracle.com>
parents: 11267
diff changeset
203 } else if (improvedStamp) {
e231671f39d0 Try constant folding in canonicalizer even if tryInferStamp didn't change anything.
Roland Schatz <roland.schatz@oracle.com>
parents: 11267
diff changeset
204 // the improved stamp may enable additional canonicalization
15866
0456d9b10322 CanonicalizerPhase: canonicalize usages when stamp changes
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15592
diff changeset
205 if (!tryCanonicalize(valueNode, nodeClass)) {
0456d9b10322 CanonicalizerPhase: canonicalize usages when stamp changes
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15592
diff changeset
206 valueNode.usages().forEach(workList::add);
0456d9b10322 CanonicalizerPhase: canonicalize usages when stamp changes
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 15592
diff changeset
207 }
11267
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
208 }
10856
a0401b1f7cc4 Retry canonicalization after inferStamp.
Roland Schatz <roland.schatz@oracle.com>
parents: 10421
diff changeset
209 }
5808
7bc36486ef27 Slightly more sensible work order in Canonicalizer (not unused? -> not canonicalized? -> stamp) and be sure to kill unused
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5806
diff changeset
210 }
7bc36486ef27 Slightly more sensible work order in Canonicalizer (not unused? -> not canonicalized? -> stamp) and be sure to kill unused
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5806
diff changeset
211 }
5419
3c16d338888e Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5380
diff changeset
212 }
3c16d338888e Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5380
diff changeset
213 }
3c16d338888e Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 5380
diff changeset
214
11882
51059863da73 replace instanceof type tests for Canonicalizable and Simplifiable with extra boolean properties in NodeClass (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11881
diff changeset
215 public static boolean tryGlobalValueNumbering(Node node, NodeClass nodeClass) {
11666
3967f9f306f8 Factor usages of getNodeClass().
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 11653
diff changeset
216 if (nodeClass.valueNumberable() && !nodeClass.isLeafNode()) {
11266
2290f6b53429 Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11265
diff changeset
217 Node newNode = node.graph().findDuplicate(node);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
218 if (newNode != null) {
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
219 assert !(node instanceof FixedNode || newNode instanceof FixedNode);
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
220 node.replaceAtUsages(newNode);
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
221 node.safeDelete();
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
222 METRIC_GLOBAL_VALUE_NUMBERING_HITS.increment();
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
223 Debug.log("GVN applied and new node is %1s", newNode);
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
224 return true;
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
225 }
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
226 }
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
227 return false;
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
228 }
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
229
11882
51059863da73 replace instanceof type tests for Canonicalizable and Simplifiable with extra boolean properties in NodeClass (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11881
diff changeset
230 public boolean tryCanonicalize(final Node node, NodeClass nodeClass) {
51059863da73 replace instanceof type tests for Canonicalizable and Simplifiable with extra boolean properties in NodeClass (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11881
diff changeset
231 boolean result = baseTryCanonicalize(node, nodeClass);
11884
008500ebc6c6 modified CustomCanonicalizer to deal with Nodes (instead of ValueNodes) to avoid extra type testing during canonicalization (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11883
diff changeset
232 if (!result && customCanonicalizer != null) {
008500ebc6c6 modified CustomCanonicalizer to deal with Nodes (instead of ValueNodes) to avoid extra type testing during canonicalization (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11883
diff changeset
233 Node canonical = customCanonicalizer.canonicalize(node);
11266
2290f6b53429 Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11265
diff changeset
234 result = performReplacement(node, canonical);
16587
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
235 if (!result) {
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
236 customCanonicalizer.simplify(node, tool);
173da8c3095d support simplification in CustomCanonicalizer and turn it into an abstract class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16553
diff changeset
237 }
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
238 }
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
239 return result;
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
240 }
7530
5e3d1a68664e applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents: 7522
diff changeset
241
16206
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
242 private static AutoCloseable getCanonicalizeableContractAssertion(Node node) {
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
243 boolean needsAssertion = false;
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
244 assert (needsAssertion = true) == true;
16257
7e87ec3d156a enable new-node assertion for all Canonicalizable node types
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16247
diff changeset
245 if (needsAssertion) {
16206
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
246 Mark mark = node.graph().getMark();
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
247 return () -> {
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
248 assert mark.equals(node.graph().getMark()) : "new node created while canonicalizing " + node.getClass().getSimpleName() + " " + node + ": " +
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
249 node.graph().getNewNodes(mark).snapshot();
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
250 };
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
251 } else {
16337
67f3267a8846 code and javadoc cleanups in Canonicalizable and NodeClassIterable
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16264
diff changeset
252 return null;
16206
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
253 }
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
254 }
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
255
11882
51059863da73 replace instanceof type tests for Canonicalizable and Simplifiable with extra boolean properties in NodeClass (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11881
diff changeset
256 public boolean baseTryCanonicalize(final Node node, NodeClass nodeClass) {
16239
de84713267fa use default methods to select Canonicalizable behavior
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16206
diff changeset
257 if (nodeClass.isCanonicalizable()) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
258 METRIC_CANONICALIZATION_CONSIDERED_NODES.increment();
13197
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
259 try (Scope s = Debug.scope("CanonicalizeNode", node)) {
16206
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
260 Node canonical;
16239
de84713267fa use default methods to select Canonicalizable behavior
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16206
diff changeset
261 try (AutoCloseable verify = getCanonicalizeableContractAssertion(node)) {
de84713267fa use default methods to select Canonicalizable behavior
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16206
diff changeset
262 canonical = ((Canonicalizable) node).canonical(tool);
16206
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
263 }
16155
c903c4e693bf run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16135
diff changeset
264 if (performReplacement(node, canonical)) {
c903c4e693bf run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16135
diff changeset
265 return true;
c903c4e693bf run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16135
diff changeset
266 }
13197
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
267 } catch (Throwable e) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
268 throw Debug.handle(e);
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
269 }
13605
3def004aaa2d Canonicalizer: allow nodes to implement simplifiable and canonicalizable
Bernhard Urban <bernhard.urban@jku.at>
parents: 13585
diff changeset
270 }
3def004aaa2d Canonicalizer: allow nodes to implement simplifiable and canonicalizable
Bernhard Urban <bernhard.urban@jku.at>
parents: 13585
diff changeset
271
3def004aaa2d Canonicalizer: allow nodes to implement simplifiable and canonicalizable
Bernhard Urban <bernhard.urban@jku.at>
parents: 13585
diff changeset
272 if (nodeClass.isSimplifiable()) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
273 Debug.log("Canonicalizer: simplifying %s", node);
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
274 METRIC_SIMPLIFICATION_CONSIDERED_NODES.increment();
13197
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
275 try (Scope s = Debug.scope("SimplifyNode", node)) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
276 node.simplify(tool);
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
277 } catch (Throwable e) {
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
278 throw Debug.handle(e);
8569b9e047cd change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents: 13191
diff changeset
279 }
16155
c903c4e693bf run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16135
diff changeset
280 return node.isDeleted();
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
281 }
16155
c903c4e693bf run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16135
diff changeset
282 return false;
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
283 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
284
9904
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
285 // @formatter:off
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
286 // cases: original node:
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
287 // |Floating|Fixed-unconnected|Fixed-connected|
11798
2fbb9fd55dde made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents: 11782
diff changeset
288 // --------------------------------------------
9904
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
289 // null| 1 | X | 3 |
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
290 // --------------------------------------------
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
291 // Floating| 2 | X | 4 |
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
292 // canonical node: --------------------------------------------
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
293 // Fixed-unconnected| X | X | 5 |
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
294 // --------------------------------------------
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
295 // Fixed-connected| 2 | X | 6 |
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
296 // --------------------------------------------
11782
106bd0ff2498 add support for a node to canonicalize itself to a ControlSinkNode
Doug Simon <doug.simon@oracle.com>
parents: 11666
diff changeset
297 // ControlSink| X | X | 7 |
106bd0ff2498 add support for a node to canonicalize itself to a ControlSinkNode
Doug Simon <doug.simon@oracle.com>
parents: 11666
diff changeset
298 // --------------------------------------------
9904
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
299 // X: must not happen (checked with assertions)
77c4b6c9d6e2 CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents: 9331
diff changeset
300 // @formatter:on
16206
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
301 private boolean performReplacement(final Node node, Node newCanonical) {
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
302 if (newCanonical == node) {
14707
6ce6c4ccba8f initial support for memory arithmetic on x86
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 14112
diff changeset
303 Debug.log("Canonicalizer: work on %1s", node);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
304 return false;
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
305 } else {
16206
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
306 Node canonical = newCanonical;
14707
6ce6c4ccba8f initial support for memory arithmetic on x86
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 14112
diff changeset
307 Debug.log("Canonicalizer: replacing %1s with %1s", node, canonical);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
308 METRIC_CANONICALIZED_NODES.increment();
11266
2290f6b53429 Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11265
diff changeset
309 StructuredGraph graph = (StructuredGraph) node.graph();
16206
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
310 if (canonical != null && !canonical.isAlive()) {
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
311 assert !canonical.isDeleted();
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
312 canonical = graph.addOrUniqueWithInputs(canonical);
2a1f3a8f76f1 handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16157
diff changeset
313 }
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
314 if (node instanceof FloatingNode) {
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
315 if (canonical == null) {
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
316 // case 1
16247
b35b25c68387 returning null Canonicalizer.canonical replaces usages with null
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16241
diff changeset
317 node.replaceAtUsages(null);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
318 graph.removeFloating((FloatingNode) node);
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
319 } else {
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
320 // case 2
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
321 assert !(canonical instanceof FixedNode) || (canonical.predecessor() != null || canonical instanceof StartNode || canonical instanceof MergeNode) : node + " -> " + canonical +
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
322 " : replacement should be floating or fixed and connected";
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
323 graph.replaceFloating((FloatingNode) node, canonical);
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
324 }
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
325 } else {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
326 assert node instanceof FixedNode && node.predecessor() != null : node + " -> " + canonical + " : node should be fixed & connected (" + node.predecessor() + ")";
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
327 FixedNode fixed = (FixedNode) node;
11782
106bd0ff2498 add support for a node to canonicalize itself to a ControlSinkNode
Doug Simon <doug.simon@oracle.com>
parents: 11666
diff changeset
328 if (canonical instanceof ControlSinkNode) {
106bd0ff2498 add support for a node to canonicalize itself to a ControlSinkNode
Doug Simon <doug.simon@oracle.com>
parents: 11666
diff changeset
329 // case 7
14112
317bfc1ae64e CanonicalizerPhase: cosmetic simplification in performReplacement
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14023
diff changeset
330 fixed.replaceAtPredecessor(canonical);
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
331 GraphUtil.killCFG(fixed);
11782
106bd0ff2498 add support for a node to canonicalize itself to a ControlSinkNode
Doug Simon <doug.simon@oracle.com>
parents: 11666
diff changeset
332 return true;
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
333 } else {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
334 assert fixed instanceof FixedWithNextNode;
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
335 FixedWithNextNode fixedWithNext = (FixedWithNextNode) fixed;
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
336 // When removing a fixed node, new canonicalization
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
337 // opportunities for its successor may arise
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
338 assert fixedWithNext.next() != null;
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
339 tool.addToWorkList(fixedWithNext.next());
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
340 if (canonical == null) {
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
341 // case 3
16247
b35b25c68387 returning null Canonicalizer.canonical replaces usages with null
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16241
diff changeset
342 node.replaceAtUsages(null);
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
343 graph.removeFixed(fixedWithNext);
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
344 } else if (canonical instanceof FloatingNode) {
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
345 // case 4
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
346 graph.replaceFixedWithFloating(fixedWithNext, (FloatingNode) canonical);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
347 } else {
12484
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
348 assert canonical instanceof FixedNode;
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
349 if (canonical.predecessor() == null) {
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
350 assert !canonical.cfgSuccessors().iterator().hasNext() : "replacement " + canonical + " shouldn't have successors";
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
351 // case 5
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
352 graph.replaceFixedWithFixed(fixedWithNext, (FixedWithNextNode) canonical);
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
353 } else {
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
354 assert canonical.cfgSuccessors().iterator().hasNext() : "replacement " + canonical + " should have successors";
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
355 // case 6
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
356 node.replaceAtUsages(canonical);
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
357 graph.removeFixed(fixedWithNext);
2d8a8980eda8 Canonicalize DynamicDeoptimize nodes back to Deoptimize when used with a constant reason&action
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 12052
diff changeset
358 }
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
359 }
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
360 }
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
361 }
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
362 return true;
7307
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
363 }
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
364 }
dc3e86fd3be1 Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7256
diff changeset
365
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
366 /**
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
367 * Calls {@link ValueNode#inferStamp()} on the node and, if it returns true (which means
11267
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
368 * that the stamp has changed), re-queues the node's usages. If the stamp has changed then
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
369 * this method also checks if the stamp now describes a constant integer value, in which
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
370 * case the node is replaced with a constant.
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
371 */
11267
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
372 private boolean tryInferStamp(ValueNode node) {
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
373 if (node.isAlive()) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
374 METRIC_INFER_STAMP_CALLED.increment();
11267
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
375 if (node.inferStamp()) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
376 METRIC_STAMP_CHANGED.increment();
11267
ceb2703b40b8 Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11266
diff changeset
377 for (Node usage : node.usages()) {
15956
edc33e8715d5 NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15866
diff changeset
378 workList.add(usage);
5657
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5558
diff changeset
379 }
11265
ef6915cf1e59 Add illegal stamp
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 10856
diff changeset
380 return true;
5657
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5558
diff changeset
381 }
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5558
diff changeset
382 }
10856
a0401b1f7cc4 Retry canonicalization after inferStamp.
Roland Schatz <roland.schatz@oracle.com>
parents: 10421
diff changeset
383 return false;
5657
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5558
diff changeset
384 }
d71eb56d6bb0 new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents: 5558
diff changeset
385
9965
6c13b749d3f9 Tool: make class non-static
Bernhard Urban <bernhard.urban@jku.at>
parents: 9916
diff changeset
386 private final class Tool implements SimplifierTool {
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
387
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
388 @Override
11879
7e57add9c0d5 broadened types in SimplifierTool interface so that it can be moved to the com.oracle.graal.graph project (GRAAL-506)
Doug Simon <doug.simon@oracle.com>
parents: 11798
diff changeset
389 public void deleteBranch(Node branch) {
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
390 branch.predecessor().replaceFirstSuccessor(branch, null);
15417
b2381f53c77f pass SimplifierTool to GraphUtil.killCFG
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15387
diff changeset
391 GraphUtil.killCFG(branch, this);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
392 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
393
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
394 /**
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
395 * @return an object that can be used for recording assumptions or {@code null} if
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
396 * assumptions are not allowed in the current context.
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
397 */
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
398 @Override
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
399 public Assumptions assumptions() {
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
400 return context.getAssumptions();
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
401 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
402
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
403 @Override
11959
23ccaa863eda made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11884
diff changeset
404 public MetaAccessProvider getMetaAccess() {
12052
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
405 return context.getMetaAccess();
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
406 }
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
407
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
408 @Override
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
409 public ConstantReflectionProvider getConstantReflection() {
0afe7370260c refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents: 11959
diff changeset
410 return context.getConstantReflection();
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
411 }
4310
72d099e5be61 more CanonicalizerPhase simplifications, added Simplifiable interface
Lukas Stadler <lukas.stadler@jku.at>
parents: 4309
diff changeset
412
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
413 @Override
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
414 public void addToWorkList(Node node) {
15956
edc33e8715d5 NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents: 15866
diff changeset
415 workList.add(node);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
416 }
7326
6939a5af19d5 Be sure to remove framestate of merge when removing empty diamond shape
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 7315
diff changeset
417
16157
bd1202138e21 add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16155
diff changeset
418 public void addToWorkList(Iterable<? extends Node> nodes) {
bd1202138e21 add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16155
diff changeset
419 workList.addAll(nodes);
bd1202138e21 add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16155
diff changeset
420 }
bd1202138e21 add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16155
diff changeset
421
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
422 @Override
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
423 public void removeIfUnused(Node node) {
15387
fd435374bb93 moved tryKillUnused to GraphUtil
Miguel Garcia <miguel.m.garcia@oracle.com>
parents: 14707
diff changeset
424 GraphUtil.tryKillUnused(node);
9049
6d376d09880b Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents: 7827
diff changeset
425 }
9908
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
426
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
427 @Override
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
428 public boolean canonicalizeReads() {
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
429 return canonicalizeReads;
91295caf53b6 CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents: 9907
diff changeset
430 }
7326
6939a5af19d5 Be sure to remove framestate of merge when removing empty diamond shape
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 7315
diff changeset
431 }
3733
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
432 }
e233f5660da4 Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff changeset
433 }