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