566 StructuredGraph graph = loadMethodNode.graph(); 567 HotSpotResolvedJavaMethod method = (HotSpotResolvedJavaMethod) loadMethodNode.getMethod(); 568 ReadNode metaspaceMethod = createReadVirtualMethod(graph, loadMethodNode.getHub(), method, loadMethodNode.getReceiverType()); 569 graph.replaceFixed(loadMethodNode, metaspaceMethod); 570 } 571 572 private static void lowerGetClassNode(GetClassNode getClass, LoweringTool tool, StructuredGraph graph) { 573 StampProvider stampProvider = tool.getStampProvider(); 574 LoadHubNode hub = graph.unique(new LoadHubNode(stampProvider, getClass.getObject())); 575 HubGetClassNode hubGetClass = graph.unique(new HubGetClassNode(tool.getMetaAccess(), hub)); 576 getClass.replaceAtUsagesAndDelete(hubGetClass); 577 hub.lower(tool); 578 hubGetClass.lower(tool); 579 } 580 581 private void lowerStoreHubNode(StoreHubNode storeHub, StructuredGraph graph) { 582 WriteNode hub = createWriteHub(graph, storeHub.getObject(), storeHub.getValue()); 583 graph.replaceFixed(storeHub, hub); 584 } 585 586 @Override 587 public BarrierType fieldInitializationBarrier(JavaKind entryKind) { 588 return (entryKind == JavaKind.Object && !runtime.getVMConfig().useDeferredInitBarriers) ? BarrierType.IMPRECISE : BarrierType.NONE; 589 } 590 591 @Override 592 public BarrierType arrayInitializationBarrier(JavaKind entryKind) { 593 return (entryKind == JavaKind.Object && !runtime.getVMConfig().useDeferredInitBarriers) ? BarrierType.PRECISE : BarrierType.NONE; 594 } 595 596 private void lowerOSRStartNode(OSRStartNode osrStart) { 597 StructuredGraph graph = osrStart.graph(); 598 if (graph.getGuardsStage() == StructuredGraph.GuardsStage.FIXED_DEOPTS) { 599 StartNode newStart = graph.add(new StartNode()); 600 ParameterNode buffer = graph.addWithoutUnique(new ParameterNode(0, StampPair.createSingle(StampFactory.forKind(runtime.getTarget().wordJavaKind)))); 601 ForeignCallNode migrationEnd = graph.add(new ForeignCallNode(foreignCalls, OSR_MIGRATION_END, buffer)); 602 migrationEnd.setStateAfter(osrStart.stateAfter()); 603 newStart.setNext(migrationEnd); 604 FixedNode next = osrStart.next(); 605 osrStart.setNext(null); 606 migrationEnd.setNext(next); 607 graph.setStart(newStart); 608 609 final int wordSize = target.wordSize; 610 611 // @formatter:off 612 // taken from c2 locals_addr = osr_buf + (max_locals-1)*wordSize) 613 // @formatter:on 614 int localsOffset = (graph.method().getMaxLocals() - 1) * wordSize; 615 for (OSRLocalNode osrLocal : graph.getNodes(OSRLocalNode.TYPE)) { 766 } else { 767 return memoryRead; 768 } 769 } 770 771 private WriteNode createWriteHub(StructuredGraph graph, ValueNode object, ValueNode value) { 772 assert !object.isConstant() || object.asConstant().isDefaultForKind(); 773 774 ValueNode writeValue = value; 775 if (runtime.getVMConfig().useCompressedClassPointers) { 776 writeValue = HotSpotCompressionNode.compress(value, runtime.getVMConfig().getKlassEncoding()); 777 } 778 779 AddressNode address = createOffsetAddress(graph, object, runtime.getVMConfig().hubOffset); 780 return graph.add(new WriteNode(address, HUB_WRITE_LOCATION, writeValue, BarrierType.NONE)); 781 } 782 783 @Override 784 protected BarrierType fieldLoadBarrierType(ResolvedJavaField f) { 785 HotSpotResolvedJavaField loadField = (HotSpotResolvedJavaField) f; 786 BarrierType barrierType = BarrierType.NONE; 787 if (runtime.getVMConfig().useG1GC && loadField.getJavaKind() == JavaKind.Object && metaAccess.lookupJavaType(Reference.class).equals(loadField.getDeclaringClass()) && 788 loadField.getName().equals("referent")) { 789 barrierType = BarrierType.PRECISE; 790 } 791 return barrierType; 792 } 793 794 @Override 795 public int fieldOffset(ResolvedJavaField f) { 796 return f.getOffset(); 797 } 798 799 @Override 800 public int arrayLengthOffset() { 801 return runtime.getVMConfig().arrayOopDescLengthOffset(); 802 } 803 804 @Override 805 protected final JavaKind getStorageKind(ResolvedJavaField field) { 806 return field.getJavaKind(); 807 } 808 809 @Override 810 public ObjectCloneSnippets.Templates getObjectCloneSnippets() { 811 return objectCloneSnippets; | 566 StructuredGraph graph = loadMethodNode.graph(); 567 HotSpotResolvedJavaMethod method = (HotSpotResolvedJavaMethod) loadMethodNode.getMethod(); 568 ReadNode metaspaceMethod = createReadVirtualMethod(graph, loadMethodNode.getHub(), method, loadMethodNode.getReceiverType()); 569 graph.replaceFixed(loadMethodNode, metaspaceMethod); 570 } 571 572 private static void lowerGetClassNode(GetClassNode getClass, LoweringTool tool, StructuredGraph graph) { 573 StampProvider stampProvider = tool.getStampProvider(); 574 LoadHubNode hub = graph.unique(new LoadHubNode(stampProvider, getClass.getObject())); 575 HubGetClassNode hubGetClass = graph.unique(new HubGetClassNode(tool.getMetaAccess(), hub)); 576 getClass.replaceAtUsagesAndDelete(hubGetClass); 577 hub.lower(tool); 578 hubGetClass.lower(tool); 579 } 580 581 private void lowerStoreHubNode(StoreHubNode storeHub, StructuredGraph graph) { 582 WriteNode hub = createWriteHub(graph, storeHub.getObject(), storeHub.getValue()); 583 graph.replaceFixed(storeHub, hub); 584 } 585 586 private void lowerOSRStartNode(OSRStartNode osrStart) { 587 StructuredGraph graph = osrStart.graph(); 588 if (graph.getGuardsStage() == StructuredGraph.GuardsStage.FIXED_DEOPTS) { 589 StartNode newStart = graph.add(new StartNode()); 590 ParameterNode buffer = graph.addWithoutUnique(new ParameterNode(0, StampPair.createSingle(StampFactory.forKind(runtime.getTarget().wordJavaKind)))); 591 ForeignCallNode migrationEnd = graph.add(new ForeignCallNode(foreignCalls, OSR_MIGRATION_END, buffer)); 592 migrationEnd.setStateAfter(osrStart.stateAfter()); 593 newStart.setNext(migrationEnd); 594 FixedNode next = osrStart.next(); 595 osrStart.setNext(null); 596 migrationEnd.setNext(next); 597 graph.setStart(newStart); 598 599 final int wordSize = target.wordSize; 600 601 // @formatter:off 602 // taken from c2 locals_addr = osr_buf + (max_locals-1)*wordSize) 603 // @formatter:on 604 int localsOffset = (graph.method().getMaxLocals() - 1) * wordSize; 605 for (OSRLocalNode osrLocal : graph.getNodes(OSRLocalNode.TYPE)) { 756 } else { 757 return memoryRead; 758 } 759 } 760 761 private WriteNode createWriteHub(StructuredGraph graph, ValueNode object, ValueNode value) { 762 assert !object.isConstant() || object.asConstant().isDefaultForKind(); 763 764 ValueNode writeValue = value; 765 if (runtime.getVMConfig().useCompressedClassPointers) { 766 writeValue = HotSpotCompressionNode.compress(value, runtime.getVMConfig().getKlassEncoding()); 767 } 768 769 AddressNode address = createOffsetAddress(graph, object, runtime.getVMConfig().hubOffset); 770 return graph.add(new WriteNode(address, HUB_WRITE_LOCATION, writeValue, BarrierType.NONE)); 771 } 772 773 @Override 774 protected BarrierType fieldLoadBarrierType(ResolvedJavaField f) { 775 HotSpotResolvedJavaField loadField = (HotSpotResolvedJavaField) f; 776 if (loadField.getJavaKind() == JavaKind.Object && metaAccess.lookupJavaType(Reference.class).equals(loadField.getDeclaringClass()) && 777 loadField.getName().equals("referent")) { 778 return BarrierType.WEAK_FIELD; 779 } 780 return super.fieldLoadBarrierType(f); 781 } 782 783 @Override 784 public int fieldOffset(ResolvedJavaField f) { 785 return f.getOffset(); 786 } 787 788 @Override 789 public int arrayLengthOffset() { 790 return runtime.getVMConfig().arrayOopDescLengthOffset(); 791 } 792 793 @Override 794 protected final JavaKind getStorageKind(ResolvedJavaField field) { 795 return field.getJavaKind(); 796 } 797 798 @Override 799 public ObjectCloneSnippets.Templates getObjectCloneSnippets() { 800 return objectCloneSnippets; |