Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java @ 16553:c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Thu, 17 Jul 2014 14:28:35 +0200 |
parents | 67f3267a8846 |
children | 173da8c3095d |
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.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
32 import com.oracle.graal.nodes.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
33 import com.oracle.graal.nodes.calc.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
34 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
|
35 import com.oracle.graal.phases.*; |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
36 import com.oracle.graal.phases.tiers.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
37 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
38 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
|
39 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
40 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
|
41 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
|
42 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
|
43 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
|
44 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
|
45 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
|
46 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
|
47 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
|
48 |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
49 private final boolean canonicalizeReads; |
11566
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
50 private final CustomCanonicalizer customCanonicalizer; |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
51 |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
52 public interface CustomCanonicalizer { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7522
diff
changeset
|
53 |
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
|
54 Node canonicalize(Node node); |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
55 } |
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
56 |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
57 public CanonicalizerPhase(boolean canonicalizeReads) { |
11566
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
58 this(canonicalizeReads, null); |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
59 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
60 |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
61 public CanonicalizerPhase(boolean canonicalizeReads, CustomCanonicalizer customCanonicalizer) { |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
62 this.canonicalizeReads = canonicalizeReads; |
11566
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
63 this.customCanonicalizer = customCanonicalizer; |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
64 } |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
65 |
16264
df2fd3857607
getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16257
diff
changeset
|
66 public boolean getCanonicalizeReads() { |
df2fd3857607
getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16257
diff
changeset
|
67 return canonicalizeReads; |
df2fd3857607
getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16257
diff
changeset
|
68 } |
df2fd3857607
getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16257
diff
changeset
|
69 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
70 @Override |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
71 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
|
72 new Instance(context, canonicalizeReads, customCanonicalizer).run(graph); |
11566
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
73 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
74 |
11575
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
75 /** |
12686
ca8ab182026f
abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
76 * @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
|
77 * mark are processed |
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
78 */ |
12686
ca8ab182026f
abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
79 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
|
80 applyIncremental(graph, context, newNodesMark, true); |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
81 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
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 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
|
84 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
|
85 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
86 |
11575
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
87 /** |
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
88 * @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
|
89 * be an auto-grow node bitmap |
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
90 */ |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
91 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
|
92 applyIncremental(graph, context, workingSet, true); |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
93 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
94 |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
95 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
|
96 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
|
97 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
98 |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
99 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
|
100 applyIncremental(graph, context, workingSet, newNodesMark, true); |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
101 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
102 |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
103 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
|
104 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
|
105 } |
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
106 |
11575
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
107 private static final class Instance extends Phase { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
108 |
12686
ca8ab182026f
abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
109 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
|
110 private final PhaseContext context; |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
111 private final CustomCanonicalizer customCanonicalizer; |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
112 private final Iterable<? extends Node> initWorkingSet; |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
113 private final boolean canonicalizeReads; |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
114 |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
115 private NodeWorkList workList; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
116 private Tool tool; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
117 |
12052
0afe7370260c
refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
118 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
|
119 this(context, canonicalizeReads, null, null, customCanonicalizer); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
120 } |
5419
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
121 |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
122 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
|
123 this(context, canonicalizeReads, workingSet, null, customCanonicalizer); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
124 } |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
125 |
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 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
|
127 this(context, canonicalizeReads, null, newNodesMark, customCanonicalizer); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
128 } |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
129 |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
130 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
|
131 super("Canonicalizer"); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
132 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
|
133 this.context = context; |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
134 this.canonicalizeReads = canonicalizeReads; |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
135 this.customCanonicalizer = customCanonicalizer; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
136 this.initWorkingSet = workingSet; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
137 } |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
138 |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
139 @Override |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
140 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
|
141 boolean wholeGraph = newNodesMark == null || newNodesMark.isStart(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
142 if (initWorkingSet == null) { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
143 workList = graph.createIterativeNodeWorkList(wholeGraph, MAX_ITERATION_PER_NODE); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
144 } else { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
145 workList = graph.createIterativeNodeWorkList(false, MAX_ITERATION_PER_NODE); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
146 workList.addAll(initWorkingSet); |
5419
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
147 } |
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 if (!wholeGraph) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
149 workList.addAll(graph.getNewNodes(newNodesMark)); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
150 } |
9965
6c13b749d3f9
Tool: make class non-static
Bernhard Urban <bernhard.urban@jku.at>
parents:
9916
diff
changeset
|
151 tool = new Tool(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
152 processWorkSet(graph); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
153 } |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
154 |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
155 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
|
156 NodeEventListener listener = new NodeEventListener() { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
157 |
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
|
158 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
|
159 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
|
160 } |
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
|
161 |
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
|
162 public void inputChanged(Node node) { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
163 workList.add(node); |
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 |
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 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
|
167 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
|
168 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
169 |
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
|
170 }; |
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
|
171 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
|
172 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
|
173 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
|
174 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
175 } |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
176 } |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
177 |
11266
2290f6b53429
Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11265
diff
changeset
|
178 private void processNode(Node node) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
179 if (node.isAlive()) { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
180 METRIC_PROCESSED_NODES.increment(); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
181 |
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
|
182 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
|
183 if (tryGlobalValueNumbering(node, nodeClass)) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
184 return; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
185 } |
11266
2290f6b53429
Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11265
diff
changeset
|
186 StructuredGraph graph = (StructuredGraph) node.graph(); |
15387
fd435374bb93
moved tryKillUnused to GraphUtil
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
14707
diff
changeset
|
187 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
|
188 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
|
189 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
|
190 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
|
191 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
|
192 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
|
193 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
|
194 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
|
195 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
|
196 } 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
|
197 // 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
|
198 if (!tryCanonicalize(valueNode, nodeClass)) { |
0456d9b10322
CanonicalizerPhase: canonicalize usages when stamp changes
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15592
diff
changeset
|
199 valueNode.usages().forEach(workList::add); |
0456d9b10322
CanonicalizerPhase: canonicalize usages when stamp changes
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15592
diff
changeset
|
200 } |
11267
ceb2703b40b8
Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11266
diff
changeset
|
201 } |
10856
a0401b1f7cc4
Retry canonicalization after inferStamp.
Roland Schatz <roland.schatz@oracle.com>
parents:
10421
diff
changeset
|
202 } |
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
|
203 } |
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
|
204 } |
5419
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
205 } |
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
206 } |
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
207 |
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
|
208 public static boolean tryGlobalValueNumbering(Node node, NodeClass nodeClass) { |
11666
3967f9f306f8
Factor usages of getNodeClass().
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
11653
diff
changeset
|
209 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
|
210 Node newNode = node.graph().findDuplicate(node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
211 if (newNode != null) { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
212 assert !(node instanceof FixedNode || newNode instanceof FixedNode); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
213 node.replaceAtUsages(newNode); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
214 node.safeDelete(); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
215 METRIC_GLOBAL_VALUE_NUMBERING_HITS.increment(); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
216 Debug.log("GVN applied and new node is %1s", newNode); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
217 return true; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
218 } |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
219 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
220 return false; |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
221 } |
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
222 |
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
|
223 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
|
224 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
|
225 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
|
226 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
|
227 result = performReplacement(node, canonical); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
228 } |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
229 return result; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
230 } |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7522
diff
changeset
|
231 |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
232 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
|
233 boolean needsAssertion = false; |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
234 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
|
235 if (needsAssertion) { |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
236 Mark mark = node.graph().getMark(); |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
237 return () -> { |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
238 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
|
239 node.graph().getNewNodes(mark).snapshot(); |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
240 }; |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
241 } else { |
16337
67f3267a8846
code and javadoc cleanups in Canonicalizable and NodeClassIterable
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16264
diff
changeset
|
242 return null; |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
243 } |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
244 } |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
245 |
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
|
246 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
|
247 if (nodeClass.isCanonicalizable()) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
248 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
|
249 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
|
250 Node canonical; |
16239
de84713267fa
use default methods to select Canonicalizable behavior
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16206
diff
changeset
|
251 try (AutoCloseable verify = getCanonicalizeableContractAssertion(node)) { |
de84713267fa
use default methods to select Canonicalizable behavior
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16206
diff
changeset
|
252 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
|
253 } |
16155
c903c4e693bf
run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16135
diff
changeset
|
254 if (performReplacement(node, canonical)) { |
c903c4e693bf
run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16135
diff
changeset
|
255 return true; |
c903c4e693bf
run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16135
diff
changeset
|
256 } |
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
|
257 } 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
|
258 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
|
259 } |
13605
3def004aaa2d
Canonicalizer: allow nodes to implement simplifiable and canonicalizable
Bernhard Urban <bernhard.urban@jku.at>
parents:
13585
diff
changeset
|
260 } |
3def004aaa2d
Canonicalizer: allow nodes to implement simplifiable and canonicalizable
Bernhard Urban <bernhard.urban@jku.at>
parents:
13585
diff
changeset
|
261 |
3def004aaa2d
Canonicalizer: allow nodes to implement simplifiable and canonicalizable
Bernhard Urban <bernhard.urban@jku.at>
parents:
13585
diff
changeset
|
262 if (nodeClass.isSimplifiable()) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
263 Debug.log("Canonicalizer: simplifying %s", node); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
264 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
|
265 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
|
266 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
|
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 } |
16155
c903c4e693bf
run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16135
diff
changeset
|
270 return node.isDeleted(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
271 } |
16155
c903c4e693bf
run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16135
diff
changeset
|
272 return false; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
273 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
274 |
9904
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
275 // @formatter:off |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
276 // cases: original node: |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
277 // |Floating|Fixed-unconnected|Fixed-connected| |
11798
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11782
diff
changeset
|
278 // -------------------------------------------- |
9904
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
279 // null| 1 | X | 3 | |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
280 // -------------------------------------------- |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
281 // Floating| 2 | X | 4 | |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
282 // canonical node: -------------------------------------------- |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
283 // Fixed-unconnected| X | X | 5 | |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
284 // -------------------------------------------- |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
285 // Fixed-connected| 2 | X | 6 | |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
286 // -------------------------------------------- |
11782
106bd0ff2498
add support for a node to canonicalize itself to a ControlSinkNode
Doug Simon <doug.simon@oracle.com>
parents:
11666
diff
changeset
|
287 // 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
|
288 // -------------------------------------------- |
9904
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
289 // X: must not happen (checked with assertions) |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
290 // @formatter:on |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
291 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
|
292 if (newCanonical == node) { |
14707
6ce6c4ccba8f
initial support for memory arithmetic on x86
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
14112
diff
changeset
|
293 Debug.log("Canonicalizer: work on %1s", node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
294 return false; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
295 } else { |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
296 Node canonical = newCanonical; |
14707
6ce6c4ccba8f
initial support for memory arithmetic on x86
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
14112
diff
changeset
|
297 Debug.log("Canonicalizer: replacing %1s with %1s", node, canonical); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
298 METRIC_CANONICALIZED_NODES.increment(); |
11266
2290f6b53429
Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11265
diff
changeset
|
299 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
|
300 if (canonical != null && !canonical.isAlive()) { |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
301 assert !canonical.isDeleted(); |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
302 canonical = graph.addOrUniqueWithInputs(canonical); |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
303 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
304 if (node instanceof FloatingNode) { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
305 if (canonical == null) { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
306 // case 1 |
16247
b35b25c68387
returning null Canonicalizer.canonical replaces usages with null
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16241
diff
changeset
|
307 node.replaceAtUsages(null); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
308 graph.removeFloating((FloatingNode) node); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
309 } else { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
310 // case 2 |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
311 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
|
312 " : replacement should be floating or fixed and connected"; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
313 graph.replaceFloating((FloatingNode) node, canonical); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
314 } |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
315 } 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
|
316 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
|
317 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
|
318 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
|
319 // case 7 |
14112
317bfc1ae64e
CanonicalizerPhase: cosmetic simplification in performReplacement
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14023
diff
changeset
|
320 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
|
321 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
|
322 return true; |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
323 } 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
|
324 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
|
325 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
|
326 // 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
|
327 // 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
|
328 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
|
329 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
|
330 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
|
331 // case 3 |
16247
b35b25c68387
returning null Canonicalizer.canonical replaces usages with null
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16241
diff
changeset
|
332 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
|
333 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
|
334 } 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
|
335 // 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
|
336 graph.replaceFixedWithFloating(fixedWithNext, (FloatingNode) canonical); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
337 } 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
|
338 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
|
339 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
|
340 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
|
341 // 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
|
342 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
|
343 } 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
|
344 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
|
345 // 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
|
346 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
|
347 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
|
348 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
349 } |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
350 } |
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
351 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
352 return true; |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
353 } |
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
354 } |
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
355 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
356 /** |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
357 * 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
|
358 * 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
|
359 * 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
|
360 * case the node is replaced with a constant. |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
361 */ |
11267
ceb2703b40b8
Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11266
diff
changeset
|
362 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
|
363 if (node.isAlive()) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
364 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
|
365 if (node.inferStamp()) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
366 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
|
367 for (Node usage : node.usages()) { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
368 workList.add(usage); |
5657
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
369 } |
11265 | 370 return true; |
5657
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
371 } |
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
372 } |
10856
a0401b1f7cc4
Retry canonicalization after inferStamp.
Roland Schatz <roland.schatz@oracle.com>
parents:
10421
diff
changeset
|
373 return false; |
5657
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
374 } |
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
375 |
9965
6c13b749d3f9
Tool: make class non-static
Bernhard Urban <bernhard.urban@jku.at>
parents:
9916
diff
changeset
|
376 private final class Tool implements SimplifierTool { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
377 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
378 @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
|
379 public void deleteBranch(Node branch) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
380 branch.predecessor().replaceFirstSuccessor(branch, null); |
15417
b2381f53c77f
pass SimplifierTool to GraphUtil.killCFG
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15387
diff
changeset
|
381 GraphUtil.killCFG(branch, this); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
382 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
383 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
384 /** |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
385 * @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
|
386 * assumptions are not allowed in the current context. |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
387 */ |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
388 @Override |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
389 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
|
390 return context.getAssumptions(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
391 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
392 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
393 @Override |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11884
diff
changeset
|
394 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
|
395 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
|
396 } |
0afe7370260c
refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
397 |
0afe7370260c
refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
398 @Override |
0afe7370260c
refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
399 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
|
400 return context.getConstantReflection(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
401 } |
4310
72d099e5be61
more CanonicalizerPhase simplifications, added Simplifiable interface
Lukas Stadler <lukas.stadler@jku.at>
parents:
4309
diff
changeset
|
402 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
403 @Override |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
404 public void addToWorkList(Node node) { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
405 workList.add(node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
406 } |
7326
6939a5af19d5
Be sure to remove framestate of merge when removing empty diamond shape
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
7315
diff
changeset
|
407 |
16157
bd1202138e21
add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16155
diff
changeset
|
408 public void addToWorkList(Iterable<? extends Node> nodes) { |
bd1202138e21
add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16155
diff
changeset
|
409 workList.addAll(nodes); |
bd1202138e21
add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16155
diff
changeset
|
410 } |
bd1202138e21
add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16155
diff
changeset
|
411 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
412 @Override |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
413 public void removeIfUnused(Node node) { |
15387
fd435374bb93
moved tryKillUnused to GraphUtil
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
14707
diff
changeset
|
414 GraphUtil.tryKillUnused(node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
415 } |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
416 |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
417 @Override |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
418 public boolean canonicalizeReads() { |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
419 return canonicalizeReads; |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
420 } |
7326
6939a5af19d5
Be sure to remove framestate of merge when removing empty diamond shape
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
7315
diff
changeset
|
421 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
422 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
423 } |