32 import org.graalvm.compiler.hotspot.nodes.G1ReferentFieldReadBarrier; |
32 import org.graalvm.compiler.hotspot.nodes.G1ReferentFieldReadBarrier; |
33 import org.graalvm.compiler.hotspot.nodes.SerialArrayRangeWriteBarrier; |
33 import org.graalvm.compiler.hotspot.nodes.SerialArrayRangeWriteBarrier; |
34 import org.graalvm.compiler.hotspot.nodes.SerialWriteBarrier; |
34 import org.graalvm.compiler.hotspot.nodes.SerialWriteBarrier; |
35 import org.graalvm.compiler.nodes.StructuredGraph; |
35 import org.graalvm.compiler.nodes.StructuredGraph; |
36 import org.graalvm.compiler.nodes.ValueNode; |
36 import org.graalvm.compiler.nodes.ValueNode; |
37 import org.graalvm.compiler.nodes.extended.ArrayRangeWriteNode; |
37 import org.graalvm.compiler.nodes.extended.ArrayRangeWrite; |
38 import org.graalvm.compiler.nodes.java.AbstractCompareAndSwapNode; |
38 import org.graalvm.compiler.nodes.java.AbstractCompareAndSwapNode; |
39 import org.graalvm.compiler.nodes.java.LoweredAtomicReadAndWriteNode; |
39 import org.graalvm.compiler.nodes.java.LoweredAtomicReadAndWriteNode; |
40 import org.graalvm.compiler.nodes.memory.FixedAccessNode; |
40 import org.graalvm.compiler.nodes.memory.FixedAccessNode; |
41 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType; |
41 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType; |
42 import org.graalvm.compiler.nodes.memory.ReadNode; |
42 import org.graalvm.compiler.nodes.memory.ReadNode; |
63 } else if (n instanceof LoweredAtomicReadAndWriteNode) { |
63 } else if (n instanceof LoweredAtomicReadAndWriteNode) { |
64 LoweredAtomicReadAndWriteNode loweredAtomicReadAndWriteNode = (LoweredAtomicReadAndWriteNode) n; |
64 LoweredAtomicReadAndWriteNode loweredAtomicReadAndWriteNode = (LoweredAtomicReadAndWriteNode) n; |
65 addAtomicReadWriteNodeBarriers(loweredAtomicReadAndWriteNode, graph); |
65 addAtomicReadWriteNodeBarriers(loweredAtomicReadAndWriteNode, graph); |
66 } else if (n instanceof AbstractCompareAndSwapNode) { |
66 } else if (n instanceof AbstractCompareAndSwapNode) { |
67 addCASBarriers((AbstractCompareAndSwapNode) n, graph); |
67 addCASBarriers((AbstractCompareAndSwapNode) n, graph); |
68 } else if (n instanceof ArrayRangeWriteNode) { |
68 } else if (n instanceof ArrayRangeWrite) { |
69 ArrayRangeWriteNode node = (ArrayRangeWriteNode) n; |
69 ArrayRangeWrite node = (ArrayRangeWrite) n; |
70 if (node.isObjectArray()) { |
70 if (node.writesObjectArray()) { |
71 addArrayRangeBarriers(node, graph); |
71 addArrayRangeBarriers(node, graph); |
72 } |
72 } |
73 } |
73 } |
74 } |
74 } |
75 } |
75 } |
169 default: |
169 default: |
170 throw new GraalError("unexpected barrier type: " + barrierType); |
170 throw new GraalError("unexpected barrier type: " + barrierType); |
171 } |
171 } |
172 } |
172 } |
173 |
173 |
174 private void addArrayRangeBarriers(ArrayRangeWriteNode node, StructuredGraph graph) { |
174 private void addArrayRangeBarriers(ArrayRangeWrite write, StructuredGraph graph) { |
175 if (config.useG1GC) { |
175 if (config.useG1GC) { |
176 if (!node.isInitialization()) { |
176 if (!write.isInitialization()) { |
177 G1ArrayRangePreWriteBarrier g1ArrayRangePreWriteBarrier = graph.add(new G1ArrayRangePreWriteBarrier(node.getArray(), node.getIndex(), node.getLength())); |
177 G1ArrayRangePreWriteBarrier g1ArrayRangePreWriteBarrier = graph.add(new G1ArrayRangePreWriteBarrier(write.getAddress(), write.getLength(), write.getElementStride())); |
178 graph.addBeforeFixed(node, g1ArrayRangePreWriteBarrier); |
178 graph.addBeforeFixed(write.asNode(), g1ArrayRangePreWriteBarrier); |
179 } |
179 } |
180 G1ArrayRangePostWriteBarrier g1ArrayRangePostWriteBarrier = graph.add(new G1ArrayRangePostWriteBarrier(node.getArray(), node.getIndex(), node.getLength())); |
180 G1ArrayRangePostWriteBarrier g1ArrayRangePostWriteBarrier = graph.add(new G1ArrayRangePostWriteBarrier(write.getAddress(), write.getLength(), write.getElementStride())); |
181 graph.addAfterFixed(node, g1ArrayRangePostWriteBarrier); |
181 graph.addAfterFixed(write.asNode(), g1ArrayRangePostWriteBarrier); |
182 } else { |
182 } else { |
183 SerialArrayRangeWriteBarrier serialArrayRangeWriteBarrier = graph.add(new SerialArrayRangeWriteBarrier(node.getArray(), node.getIndex(), node.getLength())); |
183 SerialArrayRangeWriteBarrier serialArrayRangeWriteBarrier = graph.add(new SerialArrayRangeWriteBarrier(write.getAddress(), write.getLength(), write.getElementStride())); |
184 graph.addAfterFixed(node, serialArrayRangeWriteBarrier); |
184 graph.addAfterFixed(write.asNode(), serialArrayRangeWriteBarrier); |
185 } |
185 } |
186 } |
186 } |
187 |
187 |
188 @Override |
188 @Override |
189 public boolean checkContract() { |
189 public boolean checkContract() { |