src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/phases/WriteBarrierAdditionPhase.java
changeset 48861 47f19ff9903c
parent 47216 71c04702a3d5
child 49873 26ebfe8ce852
equal deleted inserted replaced
48860:5bce1b7e7800 48861:47f19ff9903c
    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() {