annotate graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/CollapseFrameForSingleSideEffectPhase.java @ 15145:df2ef5204f2b

Remove AbstractBeginNode, move the framestate from AbstractBeginNode to BeginStateSplitNode. This required some changes to loop transformations: when peeling don't create duplicates for the exit proxies.
author Gilles Duboscq <duboscq@ssw.jku.at>
date Mon, 14 Apr 2014 15:21:27 +0200
parents 6ae9af961b7c
children 0b25b81414c9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
1 /*
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
4 *
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
8 *
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
13 * accompanied this code).
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
14 *
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
18 *
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
21 * questions.
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
22 */
8415
2361bf148c06 rename packages: *snippets* -> *replacements*
Doug Simon <doug.simon@oracle.com>
parents: 7901
diff changeset
23 package com.oracle.graal.replacements;
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
24
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
25 import java.util.*;
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
26
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
27 import com.oracle.graal.graph.*;
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
28 import com.oracle.graal.nodes.*;
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
29 import com.oracle.graal.nodes.util.*;
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
30 import com.oracle.graal.phases.*;
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
31 import com.oracle.graal.phases.graph.*;
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
32 import com.oracle.graal.phases.graph.ReentrantNodeIterator.LoopInfo;
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
33 import com.oracle.graal.phases.graph.ReentrantNodeIterator.NodeIteratorClosure;
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
34
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
35 /**
13618
b87fcab6624a Replacements: use enum to describe framestate action
Bernhard Urban <bernhard.urban@jku.at>
parents: 11785
diff changeset
36 * This phase ensures that there's a single {@linkplain FrameState#AFTER_BCI collapsed frame state}
b87fcab6624a Replacements: use enum to describe framestate action
Bernhard Urban <bernhard.urban@jku.at>
parents: 11785
diff changeset
37 * per path.
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
38 *
13618
b87fcab6624a Replacements: use enum to describe framestate action
Bernhard Urban <bernhard.urban@jku.at>
parents: 11785
diff changeset
39 * Removes other frame states from {@linkplain StateSplit#hasSideEffect() non-side-effecting} nodes
b87fcab6624a Replacements: use enum to describe framestate action
Bernhard Urban <bernhard.urban@jku.at>
parents: 11785
diff changeset
40 * in the graph, and replaces them with {@linkplain FrameState#INVALID_FRAMESTATE_BCI invalid frame
b87fcab6624a Replacements: use enum to describe framestate action
Bernhard Urban <bernhard.urban@jku.at>
parents: 11785
diff changeset
41 * states}.
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
42 *
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
43 * The invalid frame states ensure that no deoptimization to a snippet frame state will happen.
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
44 */
13618
b87fcab6624a Replacements: use enum to describe framestate action
Bernhard Urban <bernhard.urban@jku.at>
parents: 11785
diff changeset
45 public class CollapseFrameForSingleSideEffectPhase extends Phase {
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
46
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
47 private static class IterationState {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
48 public final IterationState previous;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
49 public final Node node;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
50 public final Collection<IterationState> merge;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
51 public final boolean invalid;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
52
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
53 private IterationState(IterationState previous, Node node, Collection<IterationState> merge, boolean invalid) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
54 this.previous = previous;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
55 this.node = node;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
56 this.merge = merge;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
57 this.invalid = invalid;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
58 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
59
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
60 public IterationState() {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
61 this(null, null, null, false);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
62 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
63
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
64 public IterationState addSideEffect(StateSplit sideEffect) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
65 return new IterationState(this, sideEffect.asNode(), null, true);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
66 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
67
15145
df2ef5204f2b Remove AbstractBeginNode, move the framestate from AbstractBeginNode to BeginStateSplitNode.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14734
diff changeset
68 public IterationState addBranch(BeginNode begin) {
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
69 return new IterationState(this, begin, null, this.invalid);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
70 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
71
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
72 public static IterationState merge(MergeNode merge, Collection<IterationState> before, boolean invalid) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
73 return new IterationState(null, merge, before, invalid);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
74 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
75
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
76 public void markAll(NodeBitMap set) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
77 IterationState state = this;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
78 while (state != null && state.node != null && !set.contains(state.node)) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
79 set.mark(state.node);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
80 if (state.merge != null) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
81 for (IterationState branch : state.merge) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
82 branch.markAll(set);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
83 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
84 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
85 state = state.previous;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
86 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
87 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
88
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
89 public void markMasked(NodeBitMap unmasked, NodeBitMap masked) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
90 IterationState state = this;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
91 while (state != null && state.node != null && !masked.contains(state.node)) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
92 if (state.node instanceof StateSplit) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
93 unmasked.mark(state.node);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
94 StateSplit split = (StateSplit) state.node;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
95 if (split.hasSideEffect() && state.previous != null) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
96 state.previous.markAll(masked);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
97 return;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
98 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
99 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
100
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
101 if (state.merge != null) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
102 for (IterationState branch : state.merge) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
103 branch.markMasked(unmasked, masked);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
104 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
105 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
106 state = state.previous;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
107 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
108 }
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
109 }
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
110
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
111 @Override
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
112 protected void run(StructuredGraph graph) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
113 CollapseFrameForSingleSideEffectClosure closure = new CollapseFrameForSingleSideEffectClosure();
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
114 ReentrantNodeIterator.apply(closure, graph.start(), new IterationState(), null);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
115 closure.finishProcessing(graph);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
116 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
117
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
118 private static class CollapseFrameForSingleSideEffectClosure extends NodeIteratorClosure<IterationState> {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
119
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
120 private List<IterationState> returnStates = new ArrayList<>();
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
121 private List<IterationState> unwindStates = new ArrayList<>();
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
122
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
123 @Override
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
124 protected IterationState processNode(FixedNode node, IterationState currentState) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
125 IterationState state = currentState;
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
126 if (node instanceof StateSplit) {
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
127 StateSplit stateSplit = (StateSplit) node;
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
128 FrameState frameState = stateSplit.stateAfter();
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
129 if (frameState != null) {
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
130 if (stateSplit.hasSideEffect()) {
11717
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
131 stateSplit.setStateAfter(createInvalidFrameState(node));
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
132 state = state.addSideEffect(stateSplit);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
133 } else if (currentState.invalid) {
11717
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
134 stateSplit.setStateAfter(createInvalidFrameState(node));
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
135 } else {
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
136 stateSplit.setStateAfter(null);
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
137 }
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
138 if (frameState.usages().isEmpty()) {
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
139 GraphUtil.killWithUnusedFloatingInputs(frameState);
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
140 }
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
141 }
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
142 }
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
143 if (node instanceof ReturnNode) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
144 returnStates.add(currentState);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
145 } else if (node instanceof UnwindNode) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
146 unwindStates.add(currentState);
11717
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
147 }
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
148 return state;
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
149 }
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
150
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
151 @Override
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
152 protected IterationState merge(MergeNode merge, List<IterationState> states) {
11785
713a08116e97 Fix SnippetFrameStateCleanupPhase's handling of Merges: if there is no statesplit after a merge, the last statesplit inside the merges's incomming branches should get an AFTER_BCI
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11717
diff changeset
153 boolean invalid = false;
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
154 for (IterationState state : states) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
155 if (state.invalid) {
11785
713a08116e97 Fix SnippetFrameStateCleanupPhase's handling of Merges: if there is no statesplit after a merge, the last statesplit inside the merges's incomming branches should get an AFTER_BCI
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11717
diff changeset
156 invalid = true;
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
157 break;
11785
713a08116e97 Fix SnippetFrameStateCleanupPhase's handling of Merges: if there is no statesplit after a merge, the last statesplit inside the merges's incomming branches should get an AFTER_BCI
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11717
diff changeset
158 }
713a08116e97 Fix SnippetFrameStateCleanupPhase's handling of Merges: if there is no statesplit after a merge, the last statesplit inside the merges's incomming branches should get an AFTER_BCI
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11717
diff changeset
159 }
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
160 return IterationState.merge(merge, states, invalid);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
161 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
162
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
163 public void finishProcessing(StructuredGraph graph) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
164 NodeBitMap maskedSideEffects = new NodeBitMap(graph);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
165 NodeBitMap returnSideEffects = new NodeBitMap(graph);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
166 NodeBitMap unwindSideEffects = new NodeBitMap(graph);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
167
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
168 for (IterationState returnState : returnStates) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
169 returnState.markMasked(returnSideEffects, maskedSideEffects);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
170 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
171 for (IterationState unwindState : unwindStates) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
172 unwindState.markMasked(unwindSideEffects, maskedSideEffects);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
173 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
174
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
175 for (Node returnSideEffect : returnSideEffects) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
176 if (!unwindSideEffects.contains(returnSideEffect) && !maskedSideEffects.contains(returnSideEffect)) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
177 StateSplit split = (StateSplit) returnSideEffect;
14734
6ae9af961b7c Introduce separate interfaces for deoptimizing nodes that deopt to a state before, during or after their execution.
Roland Schatz <roland.schatz@oracle.com>
parents: 13751
diff changeset
178 if (split.stateAfter() != null) {
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
179 split.setStateAfter(graph.add(new FrameState(FrameState.AFTER_BCI)));
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
180 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
181 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
182 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
183
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
184 for (Node unwindSideEffect : unwindSideEffects) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
185 if (!returnSideEffects.contains(unwindSideEffect) && !maskedSideEffects.contains(unwindSideEffect)) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
186 StateSplit split = (StateSplit) unwindSideEffect;
14734
6ae9af961b7c Introduce separate interfaces for deoptimizing nodes that deopt to a state before, during or after their execution.
Roland Schatz <roland.schatz@oracle.com>
parents: 13751
diff changeset
187 if (split.stateAfter() != null) {
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
188 split.setStateAfter(graph.add(new FrameState(FrameState.AFTER_EXCEPTION_BCI)));
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
189 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
190 }
11785
713a08116e97 Fix SnippetFrameStateCleanupPhase's handling of Merges: if there is no statesplit after a merge, the last statesplit inside the merges's incomming branches should get an AFTER_BCI
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 11717
diff changeset
191 }
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
192 }
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
193
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
194 @Override
15145
df2ef5204f2b Remove AbstractBeginNode, move the framestate from AbstractBeginNode to BeginStateSplitNode.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 14734
diff changeset
195 protected IterationState afterSplit(BeginNode node, IterationState oldState) {
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
196 return oldState.addBranch(node);
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
197 }
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
198
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
199 @Override
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
200 protected Map<LoopExitNode, IterationState> processLoop(LoopBeginNode loop, IterationState initialState) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
201 LoopInfo<IterationState> info = ReentrantNodeIterator.processLoop(this, loop, initialState);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
202
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
203 boolean isNowInvalid = initialState.invalid;
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
204 for (IterationState endState : info.endStates.values()) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
205 isNowInvalid |= endState.invalid;
7901
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
206 }
93a133fc03ce clear frame states in snippets and replace with sentries
Lukas Stadler <lukas.stadler@jku.at>
parents: 7530
diff changeset
207
13751
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
208 if (isNowInvalid) {
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
209 loop.setStateAfter(createInvalidFrameState(loop));
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
210 }
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
211
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
212 IterationState endState = IterationState.merge(loop, info.endStates.values(), isNowInvalid);
9de3efd2ea8f Fix CollapseFrameForSingleSideEffectPhase.
Roland Schatz <roland.schatz@oracle.com>
parents: 13618
diff changeset
213 return ReentrantNodeIterator.processLoop(this, loop, endState).exitStates;
11717
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
214 }
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
215
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
216 private static FrameState createInvalidFrameState(FixedNode node) {
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
217 return node.graph().add(new FrameState(FrameState.INVALID_FRAMESTATE_BCI));
8a3b59397044 The SnippetFrameStateCleanupPhase now sets invalid framestates on the paths of side effecting instruction except for the last one where an AFTER_BCI is used.
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 9623
diff changeset
218 }
7271
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
219 }
9c06e8bd8769 added phase to remove unnecessary frame states from substitution snippets
Doug Simon <doug.simon@oracle.com>
parents:
diff changeset
220 }