Mercurial > hg > truffle
annotate graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java @ 9089:5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Remove erroneous javadoc in CyclicMaterializeStoreNode
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Fri, 12 Apr 2013 14:15:59 +0200 |
parents | 24ddd568aa0c |
children | f78437ffb8d3 |
rev | line source |
---|---|
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
1 /* |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
2 * Copyright (c) 2013, 2013, Oracle and/or its affiliates. All rights reserved. |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
4 * |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
8 * |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
13 * accompanied this code). |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
14 * |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
18 * |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
21 * questions. |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
22 */ |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
23 package com.oracle.graal.phases.common; |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
24 |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
25 import java.util.*; |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
26 import java.util.Map.Entry; |
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
27 |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
28 import com.oracle.graal.api.code.*; |
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
29 import com.oracle.graal.graph.*; |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
30 import com.oracle.graal.nodes.*; |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
31 import com.oracle.graal.nodes.calc.*; |
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
32 import com.oracle.graal.nodes.cfg.*; |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
33 import com.oracle.graal.nodes.extended.*; |
8299
22cab6e509a3
Remove orphaned condition in implicit null check detection
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8296
diff
changeset
|
34 import com.oracle.graal.nodes.util.*; |
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
35 import com.oracle.graal.phases.*; |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
36 import com.oracle.graal.phases.schedule.*; |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
37 |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
38 public class GuardLoweringPhase extends Phase { |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
39 |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
40 private abstract static class ScheduledNodeIterator { |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
41 |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
42 private FixedWithNextNode lastFixed; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
43 private FixedWithNextNode reconnect; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
44 private ListIterator<ScheduledNode> iterator; |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
45 |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
46 public void processNodes(List<ScheduledNode> nodes, FixedWithNextNode begin) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
47 assert begin != null; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
48 lastFixed = begin; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
49 reconnect = null; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
50 iterator = nodes.listIterator(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
51 while (iterator.hasNext()) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
52 Node node = iterator.next(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
53 if (!node.isAlive()) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
54 continue; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
55 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
56 if (reconnect != null && node instanceof FixedNode) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
57 reconnect.setNext((FixedNode) node); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
58 reconnect = null; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
59 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
60 if (node instanceof FixedWithNextNode) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
61 lastFixed = (FixedWithNextNode) node; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
62 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
63 processNode(node); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
64 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
65 } |
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
66 |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
67 protected void insert(FixedNode start, FixedWithNextNode end) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
68 this.lastFixed.setNext(start); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
69 this.lastFixed = end; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
70 this.reconnect = end; |
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
71 } |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
72 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
73 protected void replaceCurrent(FixedWithNextNode newNode) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
74 Node current = iterator.previous(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
75 iterator.next(); // needed because of the previous() call |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
76 current.replaceAndDelete(newNode); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
77 insert(newNode, newNode); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
78 iterator.set(newNode); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
79 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
80 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
81 protected abstract void processNode(Node node); |
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
82 } |
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
83 |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
84 private class UseImplicitNullChecks extends ScheduledNodeIterator { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
85 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
86 private final IdentityHashMap<ValueNode, GuardNode> nullGuarded = new IdentityHashMap<>(); |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
87 |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
88 @Override |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
89 protected void processNode(Node node) { |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
90 if (node instanceof GuardNode) { |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
91 processGuard(node); |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
92 } else if (node instanceof Access) { |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
93 processAccess((Access) node); |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
94 } |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
95 if (node instanceof StateSplit && ((StateSplit) node).stateAfter() != null) { |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
96 nullGuarded.clear(); |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
97 } else { |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
98 Iterator<Entry<ValueNode, GuardNode>> it = nullGuarded.entrySet().iterator(); |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
99 while (it.hasNext()) { |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
100 Entry<ValueNode, GuardNode> entry = it.next(); |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
101 GuardNode guard = entry.getValue(); |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
102 if (guard.usages().contains(node)) { |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
103 it.remove(); |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
104 } |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
105 } |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
106 } |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
107 } |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
108 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
109 private void processAccess(Access access) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
110 GuardNode guard = nullGuarded.get(access.object()); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
111 if (guard != null && isImplicitNullCheck(access.nullCheckLocation())) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
112 NodeInputList<ValueNode> dependencies = ((ValueNode) access).dependencies(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
113 dependencies.remove(guard); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
114 Access fixedAccess = access; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
115 if (access instanceof FloatingAccessNode) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
116 fixedAccess = ((FloatingAccessNode) access).asFixedNode(); |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8404
diff
changeset
|
117 replaceCurrent((FixedWithNextNode) fixedAccess.asNode()); |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
118 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
119 assert fixedAccess instanceof FixedNode; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
120 fixedAccess.setNullCheck(true); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
121 LogicNode condition = guard.condition(); |
9089
5ab06146e985
Rename "node()" methods in interfaces to "asNode"
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8404
diff
changeset
|
122 guard.replaceAndDelete(fixedAccess.asNode()); |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
123 if (condition.usages().isEmpty()) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
124 GraphUtil.killWithUnusedFloatingInputs(condition); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
125 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
126 nullGuarded.remove(fixedAccess.object()); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
127 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
128 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
129 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
130 private void processGuard(Node node) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
131 GuardNode guard = (GuardNode) node; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
132 if (guard.negated() && guard.condition() instanceof IsNullNode) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
133 ValueNode obj = ((IsNullNode) guard.condition()).object(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
134 nullGuarded.put(obj, guard); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
135 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
136 } |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
137 } |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
138 |
8404
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
139 private class LowerGuards extends ScheduledNodeIterator { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
140 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
141 private final Block block; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
142 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
143 public LowerGuards(Block block) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
144 this.block = block; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
145 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
146 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
147 @Override |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
148 protected void processNode(Node node) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
149 if (node instanceof GuardNode) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
150 GuardNode guard = (GuardNode) node; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
151 if (guard.negated() && guard.condition() instanceof IsNullNode) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
152 lowerToNullCheck(guard); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
153 } else { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
154 lowerToIf(guard); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
155 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
156 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
157 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
158 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
159 private void lowerToIf(GuardNode guard) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
160 StructuredGraph graph = (StructuredGraph) guard.graph(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
161 BeginNode fastPath = graph.add(new BeginNode()); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
162 DeoptimizeNode deopt = graph.add(new DeoptimizeNode(guard.action(), guard.reason())); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
163 BeginNode deoptBranch = BeginNode.begin(deopt); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
164 BeginNode trueSuccessor; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
165 BeginNode falseSuccessor; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
166 insertLoopExits(deopt); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
167 if (guard.negated()) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
168 trueSuccessor = deoptBranch; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
169 falseSuccessor = fastPath; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
170 } else { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
171 trueSuccessor = fastPath; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
172 falseSuccessor = deoptBranch; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
173 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
174 IfNode ifNode = graph.add(new IfNode(guard.condition(), trueSuccessor, falseSuccessor, trueSuccessor == fastPath ? 1 : 0)); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
175 guard.replaceAndDelete(fastPath); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
176 insert(ifNode, fastPath); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
177 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
178 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
179 private void lowerToNullCheck(GuardNode guard) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
180 IsNullNode isNull = (IsNullNode) guard.condition(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
181 NullCheckNode nullCheck = guard.graph().add(new NullCheckNode(isNull.object())); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
182 replaceCurrent(nullCheck); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
183 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
184 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
185 private void insertLoopExits(DeoptimizeNode deopt) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
186 Loop loop = block.getLoop(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
187 StructuredGraph graph = (StructuredGraph) deopt.graph(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
188 while (loop != null) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
189 LoopExitNode exit = graph.add(new LoopExitNode(loop.loopBegin())); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
190 graph.addBeforeFixed(deopt, exit); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
191 loop = loop.parent; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
192 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
193 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
194 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
195 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
196 private TargetDescription target; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
197 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
198 public GuardLoweringPhase(TargetDescription target) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
199 this.target = target; |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
200 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
201 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
202 @Override |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
203 protected void run(StructuredGraph graph) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
204 SchedulePhase schedule = new SchedulePhase(); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
205 schedule.apply(graph); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
206 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
207 for (Block block : schedule.getCFG().getBlocks()) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
208 processBlock(block, schedule); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
209 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
210 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
211 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
212 private void processBlock(Block block, SchedulePhase schedule) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
213 List<ScheduledNode> nodes = schedule.nodesFor(block); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
214 if (GraalOptions.OptImplicitNullChecks && target.implicitNullCheckLimit > 0) { |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
215 new UseImplicitNullChecks().processNodes(nodes, block.getBeginNode()); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
216 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
217 new LowerGuards(block).processNodes(nodes, block.getBeginNode()); |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
218 } |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
219 |
24ddd568aa0c
Refactor GuardLoweringPhase: use the same iterator code for implict null checks and guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8403
diff
changeset
|
220 private boolean isImplicitNullCheck(LocationNode location) { |
8295
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
221 return !(location instanceof IndexedLocationNode) && location.displacement() < target.implicitNullCheckLimit; |
60f90b4b6a12
Implement implicit null check on HIR during guard lowering
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
8221
diff
changeset
|
222 } |
8207
ed880b9992b4
Add GuardLoweringPhase which transforms floating guards into fixed if+deopt
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
diff
changeset
|
223 } |