Mercurial > hg > graal-compiler
annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/CanonicalizerPhase.java @ 19937:f599ac162bb7
CanonicalizerPhase: can not use Debug.handle without a corresponding scope/sandbox
author | Gilles Duboscq <gilles.m.duboscq@oracle.com> |
---|---|
date | Wed, 18 Mar 2015 15:51:15 +0100 |
parents | 7d933ffe6df6 |
children | 59c2d62927f7 |
rev | line source |
---|---|
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1 /* |
18187
9619ba4daf4c
Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents:
18163
diff
changeset
|
2 * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. |
3733
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 |
5507
dc71b06d09f8
Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5501
diff
changeset
|
25 import com.oracle.graal.api.meta.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
26 import com.oracle.graal.debug.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
27 import com.oracle.graal.graph.*; |
19250
8ab925a6f724
made Assumptions be part of a StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents:
19001
diff
changeset
|
28 import com.oracle.graal.graph.Graph.Mark; |
8ab925a6f724
made Assumptions be part of a StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents:
19001
diff
changeset
|
29 import com.oracle.graal.graph.Graph.NodeEventListener; |
8ab925a6f724
made Assumptions be part of a StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents:
19001
diff
changeset
|
30 import com.oracle.graal.graph.Graph.NodeEventScope; |
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.*; |
19607
b92530cb27df
Move commutative GVN into CanonicalizerPhase.
Roland Schatz <roland.schatz@oracle.com>
parents:
19561
diff
changeset
|
32 import com.oracle.graal.graph.spi.Canonicalizable.BinaryCommutative; |
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
|
33 import com.oracle.graal.nodeinfo.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
34 import com.oracle.graal.nodes.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
35 import com.oracle.graal.nodes.calc.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
36 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
|
37 import com.oracle.graal.phases.*; |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
38 import com.oracle.graal.phases.tiers.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
39 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
40 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
|
41 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
42 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
|
43 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
|
44 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
|
45 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
|
46 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
|
47 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
|
48 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
|
49 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
|
50 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
51 private boolean canonicalizeReads = true; |
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
52 private boolean simplify = true; |
19754
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
53 private final CustomCanonicalizer customCanonicalizer; |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
54 |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
55 public abstract static class CustomCanonicalizer { |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
56 |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
57 public Node canonicalize(Node node) { |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
58 return node; |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
59 } |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
60 |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
61 @SuppressWarnings("unused") |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
62 public void simplify(Node node, SimplifierTool tool) { |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
63 } |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
64 } |
18475
96528e410fab
Backed out changeset 42854d32b658
Andreas Woess <andreas.woess@jku.at>
parents:
18474
diff
changeset
|
65 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
66 public CanonicalizerPhase() { |
19754
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
67 this(null); |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
68 } |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
69 |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
70 public CanonicalizerPhase(CustomCanonicalizer customCanonicalizer) { |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
71 this.customCanonicalizer = customCanonicalizer; |
18475
96528e410fab
Backed out changeset 42854d32b658
Andreas Woess <andreas.woess@jku.at>
parents:
18474
diff
changeset
|
72 } |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
73 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
74 public void disableReadCanonicalization() { |
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
75 canonicalizeReads = false; |
18475
96528e410fab
Backed out changeset 42854d32b658
Andreas Woess <andreas.woess@jku.at>
parents:
18474
diff
changeset
|
76 } |
96528e410fab
Backed out changeset 42854d32b658
Andreas Woess <andreas.woess@jku.at>
parents:
18474
diff
changeset
|
77 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
78 public void disableSimplification() { |
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
79 simplify = false; |
16264
df2fd3857607
getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16257
diff
changeset
|
80 } |
df2fd3857607
getter for canonicalizeReads in CanonicalizerPhase
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16257
diff
changeset
|
81 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
82 @Override |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
83 protected void run(StructuredGraph graph, PhaseContext context) { |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
84 new Instance(context).run(graph); |
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 /** |
12686
ca8ab182026f
abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
88 * @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
|
89 * mark are processed |
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
90 */ |
12686
ca8ab182026f
abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
91 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
|
92 applyIncremental(graph, context, newNodesMark, 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 |
12686
ca8ab182026f
abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
95 public void applyIncremental(StructuredGraph graph, PhaseContext context, Mark newNodesMark, boolean dumpGraph) { |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
96 new Instance(context, newNodesMark).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 |
11575
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
99 /** |
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
diff
changeset
|
100 * @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
|
101 * be an auto-grow node bitmap |
00672122f256
Make inner class CanonicalizerPhase.Instance private.
Roland Schatz <roland.schatz@oracle.com>
parents:
11568
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) { |
11566
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
104 applyIncremental(graph, context, workingSet, true); |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
105 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
106 |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
107 public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable<? extends Node> workingSet, boolean dumpGraph) { |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
108 new Instance(context, workingSet).apply(graph, dumpGraph); |
11566
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
109 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
110 |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
111 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
|
112 applyIncremental(graph, context, workingSet, newNodesMark, true); |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
113 } |
aa9ce8d56771
New methods for incremental canonicalization.
Roland Schatz <roland.schatz@oracle.com>
parents:
11565
diff
changeset
|
114 |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
115 public void applyIncremental(StructuredGraph graph, PhaseContext context, Iterable<? extends Node> workingSet, Mark newNodesMark, boolean dumpGraph) { |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
116 new Instance(context, workingSet, newNodesMark).apply(graph, dumpGraph); |
5419
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
117 } |
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
118 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
119 private final class Instance extends Phase { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
120 |
12686
ca8ab182026f
abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
121 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
|
122 private final PhaseContext context; |
16553
c9d3d0964adb
proper generic types for CanonicalizerPhase.applyIncremental
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16337
diff
changeset
|
123 private final Iterable<? extends Node> initWorkingSet; |
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 private NodeWorkList workList; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
126 private Tool tool; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
127 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
128 private Instance(PhaseContext context) { |
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
129 this(context, null, null); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
130 } |
5419
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
131 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
132 private Instance(PhaseContext context, Iterable<? extends Node> workingSet) { |
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
133 this(context, workingSet, null); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
134 } |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
135 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
136 private Instance(PhaseContext context, Mark newNodesMark) { |
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
137 this(context, null, newNodesMark); |
9049
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 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
140 private Instance(PhaseContext context, Iterable<? extends Node> workingSet, Mark newNodesMark) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
141 super("Canonicalizer"); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
142 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
|
143 this.context = context; |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
144 this.initWorkingSet = workingSet; |
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 |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
147 @Override |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
148 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
|
149 boolean wholeGraph = newNodesMark == null || newNodesMark.isStart(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
150 if (initWorkingSet == null) { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
151 workList = graph.createIterativeNodeWorkList(wholeGraph, MAX_ITERATION_PER_NODE); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
152 } else { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
153 workList = graph.createIterativeNodeWorkList(false, MAX_ITERATION_PER_NODE); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
154 workList.addAll(initWorkingSet); |
5419
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
155 } |
12686
ca8ab182026f
abstracted a graph mark as a Mark object (hiding the node index)
Doug Simon <doug.simon@oracle.com>
parents:
12570
diff
changeset
|
156 if (!wholeGraph) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
157 workList.addAll(graph.getNewNodes(newNodesMark)); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
158 } |
9965
6c13b749d3f9
Tool: make class non-static
Bernhard Urban <bernhard.urban@jku.at>
parents:
9916
diff
changeset
|
159 tool = new Tool(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
160 processWorkSet(graph); |
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 |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
163 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
|
164 NodeEventListener listener = new NodeEventListener() { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
165 |
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
|
166 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
|
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 } |
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 |
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 public void inputChanged(Node node) { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
171 workList.add(node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
172 } |
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
|
173 |
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 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
|
175 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
|
176 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
177 |
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
|
178 }; |
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 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
|
180 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
|
181 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
|
182 } |
9049
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 } |
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 private void processNode(Node node) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
187 if (node.isAlive()) { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
188 METRIC_PROCESSED_NODES.increment(); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
189 |
19410
61d3cb8e1280
Add generic parameter to NodeClass. Change Graph#getNodes(Class) to Graph#getNodes(NodeClass).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19250
diff
changeset
|
190 NodeClass<?> nodeClass = node.getNodeClass(); |
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
|
191 if (tryGlobalValueNumbering(node, nodeClass)) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
192 return; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
193 } |
11266
2290f6b53429
Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11265
diff
changeset
|
194 StructuredGraph graph = (StructuredGraph) node.graph(); |
15387
fd435374bb93
moved tryKillUnused to GraphUtil
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
14707
diff
changeset
|
195 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
|
196 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
|
197 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
|
198 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
|
199 boolean improvedStamp = tryInferStamp(valueNode); |
18188
8652481a1110
Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents:
18187
diff
changeset
|
200 Constant constant = valueNode.stamp().asConstant(); |
11565
e231671f39d0
Try constant folding in canonicalizer even if tryInferStamp didn't change anything.
Roland Schatz <roland.schatz@oracle.com>
parents:
11267
diff
changeset
|
201 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
|
202 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
|
203 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
|
204 } 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
|
205 // 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
|
206 if (!tryCanonicalize(valueNode, nodeClass)) { |
0456d9b10322
CanonicalizerPhase: canonicalize usages when stamp changes
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15592
diff
changeset
|
207 valueNode.usages().forEach(workList::add); |
0456d9b10322
CanonicalizerPhase: canonicalize usages when stamp changes
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
15592
diff
changeset
|
208 } |
11267
ceb2703b40b8
Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11266
diff
changeset
|
209 } |
10856
a0401b1f7cc4
Retry canonicalization after inferStamp.
Roland Schatz <roland.schatz@oracle.com>
parents:
10421
diff
changeset
|
210 } |
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
|
211 } |
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
|
212 } |
5419
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 } |
3c16d338888e
Merge Canonicalizer and GVN Phases
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
5380
diff
changeset
|
215 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
216 public boolean tryGlobalValueNumbering(Node node, NodeClass<?> nodeClass) { |
17316
e6e678c3818f
only generate data fields equality method for leaf ValueNumberable nodes; no longer generate Node.isLeafNode()
Doug Simon <doug.simon@oracle.com>
parents:
17276
diff
changeset
|
217 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
|
218 Node newNode = node.graph().findDuplicate(node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
219 if (newNode != null) { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
220 assert !(node instanceof FixedNode || newNode instanceof FixedNode); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
221 node.replaceAtUsages(newNode); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
222 node.safeDelete(); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
223 METRIC_GLOBAL_VALUE_NUMBERING_HITS.increment(); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
224 Debug.log("GVN applied and new node is %1s", newNode); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
225 return true; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
226 } |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
227 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
228 return false; |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
229 } |
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
230 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
231 private AutoCloseable getCanonicalizeableContractAssertion(Node node) { |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
232 boolean needsAssertion = false; |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
233 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
|
234 if (needsAssertion) { |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
235 Mark mark = node.graph().getMark(); |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
236 return () -> { |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
237 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
|
238 node.graph().getNewNodes(mark).snapshot(); |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
239 }; |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
240 } else { |
16337
67f3267a8846
code and javadoc cleanups in Canonicalizable and NodeClassIterable
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16264
diff
changeset
|
241 return null; |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
242 } |
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 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
245 public boolean tryCanonicalize(final Node node, NodeClass<?> nodeClass) { |
19754
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
246 if (customCanonicalizer != null) { |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
247 Node canonical = customCanonicalizer.canonicalize(node); |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
248 if (performReplacement(node, canonical)) { |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
249 return true; |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
250 } else { |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
251 customCanonicalizer.simplify(node, tool); |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
252 } |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
253 } |
16239
de84713267fa
use default methods to select Canonicalizable behavior
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16206
diff
changeset
|
254 if (nodeClass.isCanonicalizable()) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
255 METRIC_CANONICALIZATION_CONSIDERED_NODES.increment(); |
19868
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
256 Node canonical; |
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
257 try (AutoCloseable verify = getCanonicalizeableContractAssertion(node)) { |
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
258 canonical = ((Canonicalizable) node).canonical(tool); |
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
259 if (canonical == node && nodeClass.isCommutative()) { |
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
260 canonical = ((BinaryCommutative<?>) node).maybeCommuteInputs(); |
16155
c903c4e693bf
run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16135
diff
changeset
|
261 } |
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
|
262 } catch (Throwable e) { |
19937
f599ac162bb7
CanonicalizerPhase: can not use Debug.handle without a corresponding scope/sandbox
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents:
19868
diff
changeset
|
263 throw new RuntimeException(e); |
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
|
264 } |
19868
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
265 if (performReplacement(node, canonical)) { |
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
266 return true; |
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
267 } |
13605
3def004aaa2d
Canonicalizer: allow nodes to implement simplifiable and canonicalizable
Bernhard Urban <bernhard.urban@jku.at>
parents:
13585
diff
changeset
|
268 } |
3def004aaa2d
Canonicalizer: allow nodes to implement simplifiable and canonicalizable
Bernhard Urban <bernhard.urban@jku.at>
parents:
13585
diff
changeset
|
269 |
19716
2fd45bb25118
Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19609
diff
changeset
|
270 if (nodeClass.isSimplifiable() && simplify) { |
17264
324ab4ce5d43
reduce noise in CanonicalizerPhase log output
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16897
diff
changeset
|
271 Debug.log(3, "Canonicalizer: simplifying %s", node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
272 METRIC_SIMPLIFICATION_CONSIDERED_NODES.increment(); |
19868
7d933ffe6df6
Remove fine grained debug scopes in the canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19754
diff
changeset
|
273 node.simplify(tool); |
16155
c903c4e693bf
run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16135
diff
changeset
|
274 return node.isDeleted(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
275 } |
16155
c903c4e693bf
run simplification if canonicalization is unsuccessful
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16135
diff
changeset
|
276 return false; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
277 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
278 |
9904
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
279 // @formatter:off |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
280 // cases: original node: |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
281 // |Floating|Fixed-unconnected|Fixed-connected| |
11798
2fbb9fd55dde
made lowering recursive instead of iterative
Doug Simon <doug.simon@oracle.com>
parents:
11782
diff
changeset
|
282 // -------------------------------------------- |
9904
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
283 // null| 1 | X | 3 | |
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 // Floating| 2 | X | 4 | |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
286 // canonical node: -------------------------------------------- |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
287 // Fixed-unconnected| X | X | 5 | |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
288 // -------------------------------------------- |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
289 // Fixed-connected| 2 | X | 6 | |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
290 // -------------------------------------------- |
11782
106bd0ff2498
add support for a node to canonicalize itself to a ControlSinkNode
Doug Simon <doug.simon@oracle.com>
parents:
11666
diff
changeset
|
291 // 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
|
292 // -------------------------------------------- |
9904
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
293 // X: must not happen (checked with assertions) |
77c4b6c9d6e2
CanonicalizerPhase: move comment
Bernhard Urban <bernhard.urban@jku.at>
parents:
9331
diff
changeset
|
294 // @formatter:on |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
295 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
|
296 if (newCanonical == node) { |
17264
324ab4ce5d43
reduce noise in CanonicalizerPhase log output
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16897
diff
changeset
|
297 Debug.log(3, "Canonicalizer: work on %1s", node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
298 return false; |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
299 } else { |
16206
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
300 Node canonical = newCanonical; |
14707
6ce6c4ccba8f
initial support for memory arithmetic on x86
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
14112
diff
changeset
|
301 Debug.log("Canonicalizer: replacing %1s with %1s", node, canonical); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
302 METRIC_CANONICALIZED_NODES.increment(); |
11266
2290f6b53429
Stop dragging a graph around in the CanonilizerPhase
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11265
diff
changeset
|
303 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
|
304 if (canonical != null && !canonical.isAlive()) { |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
305 assert !canonical.isDeleted(); |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
306 canonical = graph.addOrUniqueWithInputs(canonical); |
2a1f3a8f76f1
handle Canonicalizable.Unary/Binary in CanonicalizerPhase and EquationalReasoner
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16157
diff
changeset
|
307 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
308 if (node instanceof FloatingNode) { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
309 if (canonical == null) { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
310 // case 1 |
16247
b35b25c68387
returning null Canonicalizer.canonical replaces usages with null
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16241
diff
changeset
|
311 node.replaceAtUsages(null); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
312 graph.removeFloating((FloatingNode) node); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
313 } else { |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
314 // case 2 |
19001
5a79fa76b489
Run eclipse format.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18995
diff
changeset
|
315 assert !(canonical instanceof FixedNode) || (canonical.predecessor() != null || canonical instanceof StartNode || canonical instanceof AbstractMergeNode) : node + " -> " + |
5a79fa76b489
Run eclipse format.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18995
diff
changeset
|
316 canonical + " : replacement should be floating or fixed and connected"; |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
317 graph.replaceFloating((FloatingNode) node, canonical); |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
318 } |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
319 } 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
|
320 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
|
321 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
|
322 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
|
323 // case 7 |
14112
317bfc1ae64e
CanonicalizerPhase: cosmetic simplification in performReplacement
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14023
diff
changeset
|
324 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
|
325 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
|
326 return true; |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
327 } 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
|
328 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
|
329 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
|
330 // 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
|
331 // 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
|
332 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
|
333 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
|
334 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
|
335 // case 3 |
16247
b35b25c68387
returning null Canonicalizer.canonical replaces usages with null
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16241
diff
changeset
|
336 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
|
337 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
|
338 } 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
|
339 // 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
|
340 graph.replaceFixedWithFloating(fixedWithNext, (FloatingNode) canonical); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
341 } 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
|
342 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
|
343 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
|
344 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
|
345 // 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
|
346 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
|
347 } 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
|
348 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
|
349 // 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
|
350 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
|
351 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
|
352 } |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
353 } |
7307
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 return true; |
7307
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
357 } |
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
358 } |
dc3e86fd3be1
Introduce cutomization capability for canonicalizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7256
diff
changeset
|
359 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
360 /** |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
361 * 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
|
362 * 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
|
363 * 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
|
364 * case the node is replaced with a constant. |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
365 */ |
11267
ceb2703b40b8
Re-introduce canonicalization when the stamp represents a singleton using Stamp.asConstant
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
11266
diff
changeset
|
366 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
|
367 if (node.isAlive()) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
368 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
|
369 if (node.inferStamp()) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
370 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
|
371 for (Node usage : node.usages()) { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
372 workList.add(usage); |
5657
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
373 } |
11265 | 374 return true; |
5657
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
375 } |
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
376 } |
10856
a0401b1f7cc4
Retry canonicalization after inferStamp.
Roland Schatz <roland.schatz@oracle.com>
parents:
10421
diff
changeset
|
377 return false; |
5657
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
378 } |
d71eb56d6bb0
new stamp inference in CanonicalizerPhase, IntegerStamp.mask
Lukas Stadler <lukas.stadler@jku.at>
parents:
5558
diff
changeset
|
379 |
9965
6c13b749d3f9
Tool: make class non-static
Bernhard Urban <bernhard.urban@jku.at>
parents:
9916
diff
changeset
|
380 private final class Tool implements SimplifierTool { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
381 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
382 @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
|
383 public void deleteBranch(Node branch) { |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
384 branch.predecessor().replaceFirstSuccessor(branch, null); |
15417
b2381f53c77f
pass SimplifierTool to GraphUtil.killCFG
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15387
diff
changeset
|
385 GraphUtil.killCFG(branch, this); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
386 } |
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 |
11959
23ccaa863eda
made CodeCacheProvider independent of MetaAccessProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11884
diff
changeset
|
389 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
|
390 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
|
391 } |
0afe7370260c
refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
392 |
0afe7370260c
refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
393 @Override |
0afe7370260c
refactored constantEquals(), lookupArrayLength() and readUnsafeConstant() out of MetaAccessProvider into ConstantReflectionProvider (GRAAL-511)
Doug Simon <doug.simon@oracle.com>
parents:
11959
diff
changeset
|
394 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
|
395 return context.getConstantReflection(); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
396 } |
4310
72d099e5be61
more CanonicalizerPhase simplifications, added Simplifiable interface
Lukas Stadler <lukas.stadler@jku.at>
parents:
4309
diff
changeset
|
397 |
9049
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 void addToWorkList(Node node) { |
15956
edc33e8715d5
NodeWorkList refactoring
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15866
diff
changeset
|
400 workList.add(node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
401 } |
7326
6939a5af19d5
Be sure to remove framestate of merge when removing empty diamond shape
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
7315
diff
changeset
|
402 |
16157
bd1202138e21
add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16155
diff
changeset
|
403 public void addToWorkList(Iterable<? extends Node> nodes) { |
bd1202138e21
add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16155
diff
changeset
|
404 workList.addAll(nodes); |
bd1202138e21
add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16155
diff
changeset
|
405 } |
bd1202138e21
add SimplifierTool.addToWorkList for Iterable<Node>
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16155
diff
changeset
|
406 |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
407 @Override |
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
408 public void removeIfUnused(Node node) { |
15387
fd435374bb93
moved tryKillUnused to GraphUtil
Miguel Garcia <miguel.m.garcia@oracle.com>
parents:
14707
diff
changeset
|
409 GraphUtil.tryKillUnused(node); |
9049
6d376d09880b
Make CanonicalizerPhase reentrant.
Roland Schatz <roland.schatz@oracle.com>
parents:
7827
diff
changeset
|
410 } |
9908
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
411 |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
412 @Override |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
413 public boolean canonicalizeReads() { |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
414 return canonicalizeReads; |
91295caf53b6
CanonicalizerPhase: add OptCanonicalizeReads option (GRAAL-290)
Bernhard Urban <bernhard.urban@jku.at>
parents:
9907
diff
changeset
|
415 } |
7326
6939a5af19d5
Be sure to remove framestate of merge when removing empty diamond shape
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
7315
diff
changeset
|
416 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
417 } |
19754
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
418 |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
419 public boolean getCanonicalizeReads() { |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
420 return canonicalizeReads; |
39de568cbb02
Reintroduce CustomCanonicalizer
Stefan Anzinger <stefan.anzinger@oracle.com>
parents:
19716
diff
changeset
|
421 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
422 } |