@Override public Node canonical(CanonicalizerTool tool) { ValueNode constant = tryConstantFold(array(), index(), tool.getMetaAccess(), tool.getConstantReflection()); if (constant != null) { return constant; } return this; }
@Override public boolean inferStamp() { return updateStamp(stamp.improveWith(createStamp(graph().getAssumptions(), array(), elementKind()))); }
private boolean processLoadIndexed(LoadIndexedNode load, PEReadEliminationBlockState state, GraphEffectList effects) { if (load.index().isConstant()) { int index = ((JavaConstant) load.index().asConstant()).asInt(); JavaKind elementKind = load.elementKind(); LocationIdentity arrayLocation = NamedLocationIdentity.getArrayLocation(elementKind); return processLoad(load, load.array(), arrayLocation, index, elementKind, state, effects); } return false; }
@Override public void virtualize(VirtualizerTool tool) { ValueNode alias = tool.getAlias(array()); if (alias instanceof VirtualObjectNode) { VirtualArrayNode virtual = (VirtualArrayNode) alias; ValueNode indexValue = tool.getAlias(index()); int idx = indexValue.isConstant() ? indexValue.asJavaConstant().asInt() : -1; if (idx >= 0 && idx < virtual.entryCount()) { ValueNode entry = tool.getEntry(virtual, idx); if (stamp.isCompatible(entry.stamp(NodeView.DEFAULT))) { tool.replaceWith(entry); } else { assert stamp(NodeView.DEFAULT).getStackKind() == JavaKind.Int && (entry.stamp(NodeView.DEFAULT).getStackKind() == JavaKind.Long || entry.getStackKind() == JavaKind.Double || entry.getStackKind() == JavaKind.Illegal) : "Can only allow different stack kind two slot marker writes on one stot fields."; } } } }
protected void lowerLoadIndexedNode(LoadIndexedNode loadIndexed, LoweringTool tool) { StructuredGraph graph = loadIndexed.graph(); ValueNode array = loadIndexed.array(); array = createNullCheckedValue(array, loadIndexed, tool); JavaKind elementKind = loadIndexed.elementKind(); Stamp loadStamp = loadStamp(loadIndexed.stamp(NodeView.DEFAULT), elementKind); GuardingNode boundsCheck = getBoundsCheck(loadIndexed, array, tool); ValueNode index = loadIndexed.index(); if (UseIndexMasking.getValue(graph.getOptions())) { index = proxyIndex(loadIndexed, index, array, tool); } AddressNode address = createArrayIndexAddress(graph, array, elementKind, index, boundsCheck); ReadNode memoryRead = graph.add(new ReadNode(address, NamedLocationIdentity.getArrayLocation(elementKind), loadStamp, BarrierType.NONE)); memoryRead.setGuard(boundsCheck); ValueNode readValue = implicitLoadConvert(graph, elementKind, memoryRead); loadIndexed.replaceAtUsages(readValue); graph.replaceFixed(loadIndexed, memoryRead); }
LoadIndexedNode loadIndexedNode = (LoadIndexedNode) node; PEAppendGraphBuilderContext graphBuilderContext = new PEAppendGraphBuilderContext(methodScope, loadIndexedNode); ValueNode array = loadIndexedNode.array(); ValueNode index = loadIndexedNode.index(); for (NodePlugin nodePlugin : nodePlugins) {