@Override public Node canonical(CanonicalizerTool tool) { if (usages().count() == 0) { /* If the cast is unused, it can be eliminated. */ return input; } return this; }
@Override public void lower(LoweringTool tool) { assert threadLocalInfo.offset >= 0; ValueNode base = holder; if (base.getStackKind() == JavaKind.Object) { base = graph().unique(new FloatingWordCastNode(FrameAccess.getWordStamp(), base)); } assert base.getStackKind() == FrameAccess.getWordKind(); ConstantNode offset = ConstantNode.forIntegerKind(FrameAccess.getWordKind(), threadLocalInfo.offset, graph()); ValueNode address = graph().unique(new AddNode(base, offset)); replaceAtUsagesAndDelete(address); } }
@Override public void generate(NodeLIRBuilderTool generator) { Value value = generator.operand(input); ValueKind<?> kind = generator.getLIRGeneratorTool().getLIRKind(stamp(NodeView.DEFAULT)); assert kind.getPlatformKind().getSizeInBytes() == value.getPlatformKind().getSizeInBytes(); if (kind.equals(value.getValueKind())) { generator.setResult(this, value); } else { AllocatableValue result = generator.getLIRGeneratorTool().newVariable(kind); generator.getLIRGeneratorTool().emitMove(result, value); generator.setResult(this, result); } } }
@Override protected ValueNode createReadHub(StructuredGraph graph, ValueNode object, LoweringTool tool) { if (tool.getLoweringStage() != LoweringTool.StandardLoweringStage.LOW_TIER) { return graph.unique(new LoadHubNode(tool.getStampProvider(), object)); } assert !object.isConstant() || object.asJavaConstant().isNull(); Stamp headerBitsStamp = StampFactory.forUnsignedInteger(8 * getObjectLayout().getReferenceSize()); ConstantNode headerOffset = ConstantNode.forIntegerKind(target.wordJavaKind, getObjectLayout().getHubOffset(), graph); AddressNode headerAddress = graph.unique(new OffsetAddressNode(object, headerOffset)); ValueNode headerBits = graph.unique(new FloatingReadNode(headerAddress, NamedLocationIdentity.FINAL_LOCATION, null, headerBitsStamp, null, BarrierType.NONE)); ValueNode hubBits; int encodingShift = ReferenceAccess.singleton().getCompressEncoding().getShift(); if (encodingShift != 0) { assert (Long.MAX_VALUE << encodingShift) == ObjectHeader.BITS_CLEAR.rawValue() : "Compression shift must mask object header bits"; hubBits = graph.unique(new UnsignedRightShiftNode(headerBits, ConstantNode.forInt(encodingShift, graph))); } else { hubBits = graph.unique(new AndNode(headerBits, ConstantNode.forIntegerStamp(headerBitsStamp, ObjectHeader.BITS_CLEAR.rawValue(), graph))); } FloatingWordCastNode hubRef = graph.unique(new FloatingWordCastNode(hubStamp, hubBits)); return maybeUncompress(hubRef); }