37 import org.graalvm.compiler.nodes.DeoptimizingNode; |
37 import org.graalvm.compiler.nodes.DeoptimizingNode; |
38 import org.graalvm.compiler.nodes.FixedWithNextNode; |
38 import org.graalvm.compiler.nodes.FixedWithNextNode; |
39 import org.graalvm.compiler.nodes.LoopBeginNode; |
39 import org.graalvm.compiler.nodes.LoopBeginNode; |
40 import org.graalvm.compiler.nodes.StructuredGraph; |
40 import org.graalvm.compiler.nodes.StructuredGraph; |
41 import org.graalvm.compiler.nodes.ValueNode; |
41 import org.graalvm.compiler.nodes.ValueNode; |
42 import org.graalvm.compiler.nodes.extended.ArrayRangeWriteNode; |
42 import org.graalvm.compiler.nodes.extended.ArrayRangeWrite; |
43 import org.graalvm.compiler.nodes.java.LoweredAtomicReadAndWriteNode; |
43 import org.graalvm.compiler.nodes.java.LoweredAtomicReadAndWriteNode; |
44 import org.graalvm.compiler.nodes.java.LogicCompareAndSwapNode; |
44 import org.graalvm.compiler.nodes.java.LogicCompareAndSwapNode; |
45 import org.graalvm.compiler.nodes.memory.FixedAccessNode; |
45 import org.graalvm.compiler.nodes.memory.FixedAccessNode; |
46 import org.graalvm.compiler.nodes.memory.HeapAccess; |
46 import org.graalvm.compiler.nodes.memory.HeapAccess; |
47 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType; |
47 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType; |
120 } |
120 } |
121 |
121 |
122 private boolean hasAttachedBarrier(FixedWithNextNode node) { |
122 private boolean hasAttachedBarrier(FixedWithNextNode node) { |
123 final Node next = node.next(); |
123 final Node next = node.next(); |
124 final Node previous = node.predecessor(); |
124 final Node previous = node.predecessor(); |
125 boolean validatePreBarrier = useG1GC() && (isObjectWrite(node) || !((ArrayRangeWriteNode) node).isInitialization()); |
125 boolean validatePreBarrier = useG1GC() && (isObjectWrite(node) || !((ArrayRangeWrite) node).isInitialization()); |
126 if (node instanceof WriteNode) { |
126 if (node instanceof WriteNode) { |
127 WriteNode writeNode = (WriteNode) node; |
127 WriteNode writeNode = (WriteNode) node; |
128 if (writeNode.getLocationIdentity().isInit()) { |
128 if (writeNode.getLocationIdentity().isInit()) { |
129 validatePreBarrier = false; |
129 validatePreBarrier = false; |
130 } |
130 } |
141 private static boolean isObjectBarrier(FixedWithNextNode node, final Node next) { |
141 private static boolean isObjectBarrier(FixedWithNextNode node, final Node next) { |
142 return next instanceof ObjectWriteBarrier && validateBarrier((FixedAccessNode) node, (ObjectWriteBarrier) next); |
142 return next instanceof ObjectWriteBarrier && validateBarrier((FixedAccessNode) node, (ObjectWriteBarrier) next); |
143 } |
143 } |
144 |
144 |
145 private static boolean isArrayBarrier(FixedWithNextNode node, final Node next) { |
145 private static boolean isArrayBarrier(FixedWithNextNode node, final Node next) { |
146 return (next instanceof ArrayRangeWriteBarrier) && ((ArrayRangeWriteNode) node).getArray() == ((ArrayRangeWriteBarrier) next).getObject(); |
146 return (next instanceof ArrayRangeWriteBarrier) && ((ArrayRangeWrite) node).getAddress() == ((ArrayRangeWriteBarrier) next).getAddress(); |
147 } |
147 } |
148 |
148 |
149 private static boolean isObjectWrite(Node node) { |
149 private static boolean isObjectWrite(Node node) { |
150 // Read nodes with barrier attached (G1 Ref field) are not validated yet. |
150 // Read nodes with barrier attached (G1 Ref field) are not validated yet. |
151 return node instanceof FixedAccessNode && ((HeapAccess) node).getBarrierType() != BarrierType.NONE && !(node instanceof ReadNode); |
151 return node instanceof FixedAccessNode && ((HeapAccess) node).getBarrierType() != BarrierType.NONE && !(node instanceof ReadNode); |
152 } |
152 } |
153 |
153 |
154 private static boolean isObjectArrayRangeWrite(Node node) { |
154 private static boolean isObjectArrayRangeWrite(Node node) { |
155 return node instanceof ArrayRangeWriteNode && ((ArrayRangeWriteNode) node).isObjectArray(); |
155 return node instanceof ArrayRangeWrite && ((ArrayRangeWrite) node).writesObjectArray(); |
156 } |
156 } |
157 |
157 |
158 private static void expandFrontier(NodeFlood frontier, Node node) { |
158 private static void expandFrontier(NodeFlood frontier, Node node) { |
159 for (Node previousNode : node.cfgPredecessors()) { |
159 for (Node previousNode : node.cfgPredecessors()) { |
160 if (previousNode != null) { |
160 if (previousNode != null) { |