Mercurial > hg > graal-jvmci-8
changeset 22255:565196752144
KlassPointerStamp needs valid getStackKind implementation
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackendFactory.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackendFactory.java Mon Jul 20 11:18:35 2015 -0700 @@ -38,6 +38,7 @@ import com.oracle.graal.graphbuilderconf.GraphBuilderConfiguration.Plugins; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.phases.util.*; import com.oracle.graal.replacements.amd64.*; @@ -76,7 +77,7 @@ try (InitTimer rt = timer("create Lowerer provider")) { lowerer = createLowerer(runtime, metaAccess, foreignCalls, registers, target); } - HotSpotStampProvider stampProvider = new HotSpotStampProvider(); + HotSpotStampProvider stampProvider = new HotSpotStampProvider(target.wordKind); Providers p = new Providers(metaAccess, codeCache, constantReflection, foreignCalls, lowerer, null, stampProvider); try (InitTimer rt = timer("create SnippetReflection provider")) { @@ -86,7 +87,7 @@ replacements = createReplacements(runtime, p, snippetReflection); } try (InitTimer rt = timer("create WordTypes")) { - wordTypes = new HotSpotWordTypes(metaAccess, target.wordKind); + wordTypes = new HotSpotWordTypes(metaAccess, target.wordKind, stampProvider.createHubStamp(false), MethodPointerStamp.method()); } try (InitTimer rt = timer("create GraphBuilderPhase plugins")) { plugins = createGraphBuilderPlugins(runtime, target, constantReflection, foreignCalls, metaAccess, snippetReflection, replacements, wordTypes, stampProvider); @@ -167,15 +168,15 @@ } else { /* * System V Application Binary Interface, AMD64 Architecture Processor Supplement - * + * * Draft Version 0.96 - * + * * http://www.uclibc.org/docs/psABI-x86_64.pdf - * + * * 3.2.1 - * + * * ... - * + * * This subsection discusses usage of each register. Registers %rbp, %rbx and %r12 * through %r15 "belong" to the calling function and the called function is required to * preserve their values. In other words, a called function must preserve these
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackendFactory.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackendFactory.java Mon Jul 20 11:18:35 2015 -0700 @@ -35,6 +35,7 @@ import com.oracle.graal.graphbuilderconf.GraphBuilderConfiguration.Plugins; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.java.*; import com.oracle.graal.nodes.spi.*; @@ -56,11 +57,11 @@ Value[] nativeABICallerSaveRegisters = createNativeABICallerSaveRegisters(runtime.getConfig(), codeCache.getRegisterConfig()); HotSpotForeignCallsProvider foreignCalls = new SPARCHotSpotForeignCallsProvider(runtime, metaAccess, codeCache, nativeABICallerSaveRegisters); LoweringProvider lowerer = createLowerer(runtime, metaAccess, foreignCalls, registers, target); - HotSpotStampProvider stampProvider = new HotSpotStampProvider(); + HotSpotStampProvider stampProvider = new HotSpotStampProvider(codeCache.getTarget().wordKind); Providers p = new Providers(metaAccess, codeCache, constantReflection, foreignCalls, lowerer, null, stampProvider); HotSpotSnippetReflectionProvider snippetReflection = new HotSpotSnippetReflectionProvider(runtime); HotSpotReplacementsImpl replacements = new HotSpotReplacementsImpl(p, snippetReflection, runtime.getConfig(), target); - HotSpotWordTypes wordTypes = new HotSpotWordTypes(metaAccess, target.wordKind); + HotSpotWordTypes wordTypes = new HotSpotWordTypes(metaAccess, target.wordKind, stampProvider.createHubStamp(false), MethodPointerStamp.method()); Plugins plugins = createGraphBuilderPlugins(runtime, metaAccess, constantReflection, foreignCalls, stampProvider, snippetReflection, replacements, wordTypes); replacements.setGraphBuilderPlugins(plugins); HotSpotSuitesProvider suites = createSuites(runtime, plugins, codeCache);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Mon Jul 20 11:18:35 2015 -0700 @@ -274,7 +274,7 @@ ResolvedJavaType receiverType = invoke.getReceiverType(); if (hsMethod.isInVirtualMethodTable(receiverType)) { Kind wordKind = runtime.getTarget().wordKind; - ValueNode hub = createReadHub(graph, receiver, receiverNullCheck); + ValueNode hub = createReadHub(graph, receiver, receiverNullCheck, tool); ReadNode metaspaceMethod = createReadVirtualMethod(graph, hub, hsMethod, receiverType); // We use LocationNode.ANY_LOCATION for the reads that access the @@ -332,13 +332,13 @@ } @Override - protected ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor) { + protected ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor, LoweringTool tool) { /* * Anchor the read of the element klass to the cfg, because it is only valid when arrayClass * is an object class, which might not be the case in other parts of the compiled method. */ AddressNode address = createOffsetAddress(graph, arrayHub, runtime.getConfig().arrayClassElementOffset); - return graph.unique(new FloatingReadNode(address, OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION, null, KlassPointerStamp.klassNonNull(), AbstractBeginNode.prevBegin(anchor))); + return graph.unique(new FloatingReadNode(address, OBJ_ARRAY_KLASS_ELEMENT_KLASS_LOCATION, null, tool.getStampProvider().createHubStamp(true), AbstractBeginNode.prevBegin(anchor))); } @Override @@ -485,11 +485,11 @@ } @Override - protected ValueNode createReadHub(StructuredGraph graph, ValueNode object, GuardingNode guard) { + protected ValueNode createReadHub(StructuredGraph graph, ValueNode object, GuardingNode guard, LoweringTool tool) { HotSpotVMConfig config = runtime.getConfig(); assert !object.isConstant() || object.isNullConstant(); - KlassPointerStamp hubStamp = KlassPointerStamp.klassNonNull(); + KlassPointerStamp hubStamp = (KlassPointerStamp) tool.getStampProvider().createHubStamp(true); if (config.useCompressedClassPointers) { hubStamp = hubStamp.compressed(config.getKlassEncoding()); }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotProviders.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotProviders.java Mon Jul 20 11:18:35 2015 -0700 @@ -47,7 +47,7 @@ public HotSpotProviders(MetaAccessProvider metaAccess, HotSpotCodeCacheProvider codeCache, ConstantReflectionProvider constantReflection, HotSpotForeignCallsProvider foreignCalls, LoweringProvider lowerer, Replacements replacements, SuitesProvider suites, HotSpotRegistersProvider registers, SnippetReflectionProvider snippetReflection, HotSpotWordTypes wordTypes, Plugins graphBuilderPlugins) { - super(metaAccess, codeCache, constantReflection, foreignCalls, lowerer, replacements, new HotSpotStampProvider()); + super(metaAccess, codeCache, constantReflection, foreignCalls, lowerer, replacements, new HotSpotStampProvider(codeCache.getTarget().wordKind)); this.suites = suites; this.registers = registers; this.snippetReflection = snippetReflection;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotStampProvider.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotStampProvider.java Mon Jul 20 11:18:35 2015 -0700 @@ -22,17 +22,43 @@ */ package com.oracle.graal.hotspot.meta; +import jdk.internal.jvmci.meta.*; + import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.nodes.spi.*; public class HotSpotStampProvider implements StampProvider { + private final KlassPointerStamp klassStamp; + + private final KlassPointerStamp klassNonNullStamp; + + @SuppressWarnings("unused") private final Kind wordKind; + + public HotSpotStampProvider(Kind wordKind) { + this.wordKind = wordKind; + klassStamp = new KlassPointerStamp(false, false, wordKind); + klassNonNullStamp = new KlassPointerStamp(true, false, wordKind); + } + + public KlassPointerStamp klass() { + return klassStamp; + } + + public KlassPointerStamp klassNonNull() { + return klassNonNullStamp; + } + public Stamp createHubStamp(ObjectStamp object) { - return KlassPointerStamp.klassNonNull(); + return klassNonNull(); } public Stamp createMethodStamp() { return MethodPointerStamp.methodNonNull(); } + + public Stamp createHubStamp(boolean nonNull) { + return nonNull ? klassNonNullStamp : klassStamp; + } }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotWordOperationPlugin.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotWordOperationPlugin.java Mon Jul 20 11:18:35 2015 -0700 @@ -43,17 +43,21 @@ import com.oracle.graal.nodes.memory.address.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.replacements.*; -import com.oracle.graal.word.*; /** * Extends {@link WordOperationPlugin} to handle {@linkplain HotSpotOperation HotSpot word * operations}. */ class HotSpotWordOperationPlugin extends WordOperationPlugin { - public HotSpotWordOperationPlugin(SnippetReflectionProvider snippetReflection, WordTypes wordTypes) { + + public HotSpotWordOperationPlugin(SnippetReflectionProvider snippetReflection, HotSpotWordTypes wordTypes) { super(snippetReflection, wordTypes); } + HotSpotWordTypes wordTypes() { + return (HotSpotWordTypes) wordTypes; + } + @Override protected LoadIndexedNode createLoadIndexedNode(ValueNode array, ValueNode index) { ResolvedJavaType arrayType = StampTool.typeOrNull(array); @@ -115,17 +119,17 @@ case TO_KLASS_POINTER: assert args.length == 1; - b.addPush(returnKind, new PointerCastNode(KlassPointerStamp.klass(), args[0])); + b.addPush(returnKind, new PointerCastNode(wordTypes().getKlassPointerStamp(), args[0])); break; case TO_METHOD_POINTER: assert args.length == 1; - b.addPush(returnKind, new PointerCastNode(MethodPointerStamp.method(), args[0])); + b.addPush(returnKind, new PointerCastNode(wordTypes().getMethodPointerStamp(), args[0])); break; case READ_KLASS_POINTER: assert args.length == 2 || args.length == 3; - Stamp readStamp = KlassPointerStamp.klass(); + Stamp readStamp = wordTypes().getKlassPointerStamp(); AddressNode address = makeAddress(b, args[0], args[1]); LocationIdentity location; if (args.length == 2) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/KlassPointerStamp.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/type/KlassPointerStamp.java Mon Jul 20 11:18:35 2015 -0700 @@ -33,34 +33,23 @@ public final class KlassPointerStamp extends MetaspacePointerStamp { - private static final KlassPointerStamp KLASS = new KlassPointerStamp(false, false); - - private static final KlassPointerStamp KLASS_NON_NULL = new KlassPointerStamp(true, false); - - private static final KlassPointerStamp KLASS_ALWAYS_NULL = new KlassPointerStamp(false, true); - private final CompressEncoding encoding; - public static KlassPointerStamp klass() { - return KLASS; + private final Kind kind; + + public KlassPointerStamp(boolean nonNull, boolean alwaysNull, Kind kind) { + this(nonNull, alwaysNull, null, kind); } - public static KlassPointerStamp klassNonNull() { - return KLASS_NON_NULL; - } - - private KlassPointerStamp(boolean nonNull, boolean alwaysNull) { - this(nonNull, alwaysNull, null); - } - - private KlassPointerStamp(boolean nonNull, boolean alwaysNull, CompressEncoding encoding) { + private KlassPointerStamp(boolean nonNull, boolean alwaysNull, CompressEncoding encoding, Kind kind) { super(nonNull, alwaysNull); this.encoding = encoding; + this.kind = kind; } @Override protected AbstractPointerStamp copyWith(boolean newNonNull, boolean newAlwaysNull) { - return new KlassPointerStamp(newNonNull, newAlwaysNull, encoding); + return new KlassPointerStamp(newNonNull, newAlwaysNull, encoding, kind); } @Override @@ -79,11 +68,11 @@ public Stamp constant(Constant c, MetaAccessProvider meta) { if (isCompressed()) { if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(c)) { - return new KlassPointerStamp(false, true, encoding); + return new KlassPointerStamp(false, true, encoding, kind); } } else { if (JavaConstant.NULL_POINTER.equals(c)) { - return KLASS_ALWAYS_NULL; + return new KlassPointerStamp(false, true, encoding, kind); } } @@ -92,11 +81,7 @@ if (nonNull()) { return this; } - if (isCompressed()) { - return new KlassPointerStamp(true, false, encoding); - } else { - return KLASS_NON_NULL; - } + return new KlassPointerStamp(true, false, encoding, kind); } @Override @@ -127,12 +112,12 @@ public KlassPointerStamp compressed(CompressEncoding newEncoding) { assert !isCompressed(); - return new KlassPointerStamp(nonNull(), alwaysNull(), newEncoding); + return new KlassPointerStamp(nonNull(), alwaysNull(), newEncoding, Kind.Int); } public KlassPointerStamp uncompressed() { assert isCompressed(); - return new KlassPointerStamp(nonNull(), alwaysNull()); + return new KlassPointerStamp(nonNull(), alwaysNull(), Kind.Long); } @Override @@ -177,4 +162,9 @@ } return ret.toString(); } + + @Override + public Kind getStackKind() { + return isCompressed() ? Kind.Int : Kind.Long; + } }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/LoadJavaMirrorWithKlassPhase.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/LoadJavaMirrorWithKlassPhase.java Mon Jul 20 11:18:35 2015 -0700 @@ -70,7 +70,7 @@ Stamp stamp = StampFactory.exactNonNull(metaAccess.lookupJavaType(Class.class)); if (type instanceof HotSpotResolvedObjectType) { - ConstantNode klass = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), ((HotSpotResolvedObjectType) type).klass(), metaAccess, graph); + ConstantNode klass = ConstantNode.forConstant(context.getStampProvider().createHubStamp(true), ((HotSpotResolvedObjectType) type).klass(), metaAccess, graph); AddressNode address = graph.unique(new OffsetAddressNode(klass, ConstantNode.forLong(classMirrorOffset, graph))); ValueNode read = graph.unique(new FloatingReadNode(address, CLASS_MIRROR_LOCATION, null, stamp));
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassGetHubNode.java Mon Jul 20 11:18:35 2015 -0700 @@ -28,7 +28,6 @@ import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.nodeinfo.*; import com.oracle.graal.nodes.*; @@ -48,14 +47,16 @@ public final class ClassGetHubNode extends FloatingGuardedNode implements Lowerable, Canonicalizable, ConvertNode { public static final NodeClass<ClassGetHubNode> TYPE = NodeClass.create(ClassGetHubNode.class); @Input protected ValueNode clazz; + StampProvider stampProvider; - public ClassGetHubNode(ValueNode clazz) { - this(clazz, null); + public ClassGetHubNode(@InjectedNodeParameter StampProvider stampProvider, ValueNode clazz) { + this(stampProvider, clazz, null); } - public ClassGetHubNode(ValueNode clazz, ValueNode guard) { - super(TYPE, KlassPointerStamp.klass(), (GuardingNode) guard); + public ClassGetHubNode(@InjectedNodeParameter StampProvider stampProvider, ValueNode clazz, ValueNode guard) { + super(TYPE, stampProvider.createHubStamp(false), (GuardingNode) guard); this.clazz = clazz; + this.stampProvider = stampProvider; } @Override @@ -78,7 +79,7 @@ } if (clazz instanceof GetClassNode) { GetClassNode getClass = (GetClassNode) clazz; - return new LoadHubNode(KlassPointerStamp.klassNonNull(), getClass.getObject(), null); + return new LoadHubNode(stampProvider, getClass.getObject(), null); } if (clazz instanceof HubGetClassNode) { // replace _klass._java_mirror._klass -> _klass
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Mon Jul 20 11:18:35 2015 -0700 @@ -578,6 +578,11 @@ return loadWordFromObjectIntrinsic(object, offset, getWordKind(), identity); } + public static KlassPointer loadKlassFromObject(Object object, int offset, LocationIdentity identity) { + ReplacementsUtil.staticAssert(offset != hubOffset(), "Use loadHubIntrinsic instead of loadWordFromObject"); + return loadKlassFromObjectIntrinsic(object, offset, getWordKind(), identity); + } + /** * Reads the value of a given register. * @@ -597,6 +602,9 @@ @NodeIntrinsic(value = UnsafeLoadNode.class, setStampFromReturnType = true) private static native Word loadWordFromObjectIntrinsic(Object object, long offset, @ConstantNodeParameter Kind wordKind, @ConstantNodeParameter LocationIdentity locationIdentity); + @NodeIntrinsic(value = UnsafeLoadNode.class, setStampFromReturnType = true) + private static native KlassPointer loadKlassFromObjectIntrinsic(Object object, long offset, @ConstantNodeParameter Kind wordKind, @ConstantNodeParameter LocationIdentity locationIdentity); + @NodeIntrinsic(value = LoadHubNode.class) public static native KlassPointer loadHubIntrinsic(Object object, GuardingNode anchor);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/InstanceOfSnippets.java Mon Jul 20 11:18:35 2015 -0700 @@ -37,7 +37,6 @@ import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.replacements.TypeCheckSnippetUtils.Hints; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.nodes.*; @@ -229,38 +228,39 @@ @Override protected Arguments makeArguments(InstanceOfUsageReplacer replacer, LoweringTool tool) { + Stamp hubStamp = tool.getStampProvider().createHubStamp(true); if (replacer.instanceOf instanceof InstanceOfNode) { InstanceOfNode instanceOf = (InstanceOfNode) replacer.instanceOf; ValueNode object = instanceOf.getValue(); Assumptions assumptions = instanceOf.graph().getAssumptions(); TypeCheckHints hintInfo = new TypeCheckHints(instanceOf.type(), instanceOf.profile(), assumptions, TypeCheckMinProfileHitProbability.getValue(), TypeCheckMaxHints.getValue()); final HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) instanceOf.type(); - ConstantNode hub = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), type.klass(), providers.getMetaAccess(), instanceOf.graph()); + ConstantNode hub = ConstantNode.forConstant(hubStamp, type.klass(), providers.getMetaAccess(), instanceOf.graph()); Arguments args; StructuredGraph graph = instanceOf.graph(); if (hintInfo.hintHitProbability >= 1.0 && hintInfo.exact == null) { - Hints hints = createHints(hintInfo, providers.getMetaAccess(), false, graph); + Hints hints = createHints(hintInfo, providers.getMetaAccess(), false, graph, tool); args = new Arguments(instanceofWithProfile, graph.getGuardsStage(), tool.getLoweringStage()); args.add("object", object); - args.addVarargs("hints", KlassPointer.class, KlassPointerStamp.klassNonNull(), hints.hubs); + args.addVarargs("hints", KlassPointer.class, hubStamp, hints.hubs); args.addVarargs("hintIsPositive", boolean.class, StampFactory.forKind(Kind.Boolean), hints.isPositive); } else if (hintInfo.exact != null) { args = new Arguments(instanceofExact, graph.getGuardsStage(), tool.getLoweringStage()); args.add("object", object); - args.add("exactHub", ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), ((HotSpotResolvedObjectType) hintInfo.exact).klass(), providers.getMetaAccess(), graph)); + args.add("exactHub", ConstantNode.forConstant(hubStamp, ((HotSpotResolvedObjectType) hintInfo.exact).klass(), providers.getMetaAccess(), graph)); } else if (type.isPrimaryType()) { args = new Arguments(instanceofPrimary, graph.getGuardsStage(), tool.getLoweringStage()); args.add("hub", hub); args.add("object", object); args.addConst("superCheckOffset", type.superCheckOffset()); } else { - Hints hints = createHints(hintInfo, providers.getMetaAccess(), false, graph); + Hints hints = createHints(hintInfo, providers.getMetaAccess(), false, graph, tool); args = new Arguments(instanceofSecondary, graph.getGuardsStage(), tool.getLoweringStage()); args.add("hub", hub); args.add("object", object); - args.addVarargs("hints", KlassPointer.class, KlassPointerStamp.klassNonNull(), hints.hubs); + args.addVarargs("hints", KlassPointer.class, hubStamp, hints.hubs); args.addVarargs("hintIsPositive", boolean.class, StampFactory.forKind(Kind.Boolean), hints.isPositive); } args.add("trueValue", replacer.trueValue); @@ -275,7 +275,7 @@ ValueNode object = typeCheck.getValue(); Arguments args = new Arguments(instanceofExact, typeCheck.graph().getGuardsStage(), tool.getLoweringStage()); args.add("object", object); - args.add("exactHub", ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), ((HotSpotResolvedObjectType) typeCheck.type()).klass(), providers.getMetaAccess(), typeCheck.graph())); + args.add("exactHub", ConstantNode.forConstant(hubStamp, ((HotSpotResolvedObjectType) typeCheck.type()).klass(), providers.getMetaAccess(), typeCheck.graph())); args.add("trueValue", replacer.trueValue); args.add("falseValue", replacer.falseValue); return args;
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/NewObjectSnippets.java Mon Jul 20 11:18:35 2015 -0700 @@ -47,7 +47,6 @@ import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.debug.*; @@ -256,7 +255,7 @@ DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } - KlassPointer klass = KlassPointer.fromWord(loadWordFromObject(elementType, arrayKlassOffset(), CLASS_ARRAY_KLASS_LOCATION)); + KlassPointer klass = loadKlassFromObject(elementType, arrayKlassOffset(), CLASS_ARRAY_KLASS_LOCATION); if (probability(BranchProbabilityNode.NOT_FREQUENT_PROBABILITY, klass.isNull() || length < 0)) { DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } @@ -449,7 +448,7 @@ StructuredGraph graph = newInstanceNode.graph(); HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) newInstanceNode.instanceClass(); assert !type.isArray(); - ConstantNode hub = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), type.klass(), providers.getMetaAccess(), graph); + ConstantNode hub = ConstantNode.forConstant(tool.getStampProvider().createHubStamp(true), type.klass(), providers.getMetaAccess(), graph); int size = instanceSize(type); Arguments args = new Arguments(allocateInstance, graph.getGuardsStage(), tool.getLoweringStage()); @@ -474,7 +473,7 @@ ResolvedJavaType elementType = newArrayNode.elementType(); HotSpotResolvedObjectType arrayType = (HotSpotResolvedObjectType) elementType.getArrayClass(); Kind elementKind = elementType.getKind(); - ConstantNode hub = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), arrayType.klass(), providers.getMetaAccess(), graph); + ConstantNode hub = ConstantNode.forConstant(tool.getStampProvider().createHubStamp(true), arrayType.klass(), providers.getMetaAccess(), graph); final int headerSize = runtime.getJVMCIRuntime().getArrayBaseOffset(elementKind); HotSpotLoweringProvider lowerer = (HotSpotLoweringProvider) providers.getLowerer(); int log2ElementSize = CodeUtil.log2(lowerer.arrayScalingFactor(elementKind)); @@ -542,7 +541,7 @@ dims[i] = newmultiarrayNode.dimension(i); } HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) newmultiarrayNode.type(); - ConstantNode hub = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), type.klass(), providers.getMetaAccess(), graph); + ConstantNode hub = ConstantNode.forConstant(tool.getStampProvider().createHubStamp(true), type.klass(), providers.getMetaAccess(), graph); Arguments args = new Arguments(newmultiarray, graph.getGuardsStage(), tool.getLoweringStage()); args.add("hub", hub);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/TypeCheckSnippetUtils.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/TypeCheckSnippetUtils.java Mon Jul 20 11:18:35 2015 -0700 @@ -32,9 +32,9 @@ import jdk.internal.jvmci.hotspot.*; import jdk.internal.jvmci.meta.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.replacements.*; import com.oracle.graal.word.*; @@ -122,13 +122,13 @@ } } - static Hints createHints(TypeCheckHints hints, MetaAccessProvider metaAccess, boolean positiveOnly, StructuredGraph graph) { + static Hints createHints(TypeCheckHints hints, MetaAccessProvider metaAccess, boolean positiveOnly, StructuredGraph graph, LoweringTool tool) { ConstantNode[] hubs = new ConstantNode[hints.hints.length]; boolean[] isPositive = new boolean[hints.hints.length]; int index = 0; for (int i = 0; i < hubs.length; i++) { if (!positiveOnly || hints.hints[i].positive) { - hubs[index] = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), ((HotSpotResolvedObjectType) hints.hints[i].type).klass(), metaAccess, graph); + hubs[index] = ConstantNode.forConstant(tool.getStampProvider().createHubStamp(true), ((HotSpotResolvedObjectType) hints.hints[i].type).klass(), metaAccess, graph); isPositive[index] = hints.hints[i].positive; index++; }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java Mon Jul 20 11:18:35 2015 -0700 @@ -38,7 +38,6 @@ import com.oracle.graal.api.replacements.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.meta.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; @@ -525,7 +524,7 @@ } if (snippetInfo == arraycopyPredictedObjectWorkSnippet) { HotSpotResolvedObjectType arrayKlass = (HotSpotResolvedObjectType) tool.getMetaAccess().lookupJavaType(Object[].class); - ValueNode objectArrayKlass = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), arrayKlass.klass(), tool.getMetaAccess(), arraycopy.graph()); + ValueNode objectArrayKlass = ConstantNode.forConstant(tool.getStampProvider().createHubStamp(true), arrayKlass.klass(), tool.getMetaAccess(), arraycopy.graph()); args.add("objectArrayKlass", objectArrayKlass); args.addConst("counter", arraycopyCallCounters.get(Kind.Object)); args.addConst("copiedCounter", arraycopyCallCopiedCounters.get(Kind.Object));
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewArrayStub.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewArrayStub.java Mon Jul 20 11:18:35 2015 -0700 @@ -22,14 +22,14 @@ */ package com.oracle.graal.hotspot.stubs; -import jdk.internal.jvmci.code.*; -import jdk.internal.jvmci.hotspot.*; -import jdk.internal.jvmci.meta.*; import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*; import static com.oracle.graal.hotspot.replacements.NewObjectSnippets.*; import static com.oracle.graal.hotspot.stubs.NewInstanceStub.*; import static com.oracle.graal.hotspot.stubs.StubUtil.*; import static jdk.internal.jvmci.hotspot.HotSpotMetaAccessProvider.*; +import jdk.internal.jvmci.code.*; +import jdk.internal.jvmci.hotspot.*; +import jdk.internal.jvmci.meta.*; import com.oracle.graal.api.replacements.*; import com.oracle.graal.graph.Node.ConstantNodeParameter; @@ -37,7 +37,6 @@ import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.replacements.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.nodes.*; @@ -64,7 +63,7 @@ Object[] args = new Object[count]; assert checkConstArg(2, "intArrayHub"); assert checkConstArg(3, "threadRegister"); - args[2] = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), intArrayType.klass(), null); + args[2] = ConstantNode.forConstant(providers.getStampProvider().createHubStamp(true), intArrayType.klass(), null); args[3] = providers.getRegisters().getThreadRegister(); return args; }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Mon Jul 20 11:18:35 2015 -0700 @@ -36,7 +36,6 @@ import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.nodes.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.hotspot.replacements.*; import com.oracle.graal.hotspot.word.*; import com.oracle.graal.nodes.*; @@ -64,7 +63,7 @@ Object[] args = new Object[count]; assert checkConstArg(1, "intArrayHub"); assert checkConstArg(2, "threadRegister"); - args[1] = ConstantNode.forConstant(KlassPointerStamp.klassNonNull(), intArrayType.klass(), null); + args[1] = ConstantNode.forConstant(providers.getStampProvider().createHubStamp(true), intArrayType.klass(), null); args[2] = providers.getRegisters().getThreadRegister(); return args; }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/word/HotSpotWordTypes.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/word/HotSpotWordTypes.java Mon Jul 20 11:18:35 2015 -0700 @@ -25,7 +25,6 @@ import jdk.internal.jvmci.meta.*; import com.oracle.graal.compiler.common.type.*; -import com.oracle.graal.hotspot.nodes.type.*; import com.oracle.graal.word.*; /** @@ -48,11 +47,17 @@ */ private final ResolvedJavaType methodPointerType; - public HotSpotWordTypes(MetaAccessProvider metaAccess, Kind wordKind) { + private final Stamp klassPointerStamp; + + private final Stamp methodPointerStamp; + + public HotSpotWordTypes(MetaAccessProvider metaAccess, Kind wordKind, Stamp klassPointerStamp, Stamp methodPointerStamp) { super(metaAccess, wordKind); this.metaspacePointerType = metaAccess.lookupJavaType(MetaspacePointer.class); this.klassPointerType = metaAccess.lookupJavaType(KlassPointer.class); this.methodPointerType = metaAccess.lookupJavaType(MethodPointer.class); + this.klassPointerStamp = klassPointerStamp; + this.methodPointerStamp = methodPointerStamp; } @Override @@ -74,10 +79,18 @@ @Override public Stamp getWordStamp(ResolvedJavaType type) { if (type.equals(klassPointerType)) { - return KlassPointerStamp.klass(); + return klassPointerStamp; } else if (type.equals(methodPointerType)) { - return MethodPointerStamp.method(); + return methodPointerStamp; } return super.getWordStamp(type); } + + public Stamp getKlassPointerStamp() { + return klassPointerStamp; + } + + public Stamp getMethodPointerStamp() { + return methodPointerStamp; + } }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Mon Jul 20 11:18:35 2015 -0700 @@ -67,7 +67,7 @@ this(hubStamp(stampProvider, value), value, guard); } - public LoadHubNode(Stamp stamp, ValueNode value, ValueNode guard) { + private LoadHubNode(Stamp stamp, ValueNode value, ValueNode guard) { super(TYPE, stamp, (GuardingNode) guard); assert value != guard; this.value = value;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/StampProvider.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/StampProvider.java Mon Jul 20 11:18:35 2015 -0700 @@ -36,6 +36,11 @@ Stamp createHubStamp(ObjectStamp object); /** + * Create the stamp of a possibly null hub. + */ + Stamp createHubStamp(boolean nonNull); + + /** * Create the stamp of a pointer to a method. */ Stamp createMethodStamp();
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Mon Jul 20 11:18:19 2015 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Mon Jul 20 11:18:35 2015 -0700 @@ -87,7 +87,7 @@ } else if (n instanceof ArrayLengthNode) { lowerArrayLengthNode((ArrayLengthNode) n, tool); } else if (n instanceof LoadHubNode) { - lowerLoadHubNode((LoadHubNode) n); + lowerLoadHubNode((LoadHubNode) n, tool); } else if (n instanceof MonitorEnterNode) { lowerMonitorEnterNode((MonitorEnterNode) n, tool, graph); } else if (n instanceof CompareAndSwapNode) { @@ -118,7 +118,7 @@ } private void lowerTypeCheckNode(TypeCheckNode n, LoweringTool tool, StructuredGraph graph) { - ValueNode hub = createReadHub(graph, n.getValue(), null); + ValueNode hub = createReadHub(graph, n.getValue(), null, tool); ValueNode clazz = graph.unique(ConstantNode.forConstant(tool.getStampProvider().createHubStamp((ObjectStamp) n.getValue().stamp()), n.type().getObjectHub(), tool.getMetaAccess())); LogicNode objectEquals = graph.unique(PointerEqualsNode.create(hub, clazz)); n.replaceAndDelete(objectEquals); @@ -270,8 +270,8 @@ */ GuardingNode nullCheck = nullCheckReturn[0]; assert nullCheckReturn[0] != null || createNullCheck(array, storeIndexed, tool) == null; - ValueNode arrayClass = createReadHub(graph, array, nullCheck); - ValueNode componentHub = createReadArrayComponentHub(graph, arrayClass, storeIndexed); + ValueNode arrayClass = createReadHub(graph, array, nullCheck, tool); + ValueNode componentHub = createReadArrayComponentHub(graph, arrayClass, storeIndexed, tool); checkCastNode = graph.add(new CheckCastDynamicNode(componentHub, value, true)); graph.addBeforeFixed(storeIndexed, checkCastNode); value = checkCastNode; @@ -301,12 +301,12 @@ graph.replaceFixedWithFixed(arrayLengthNode, arrayLengthRead); } - protected void lowerLoadHubNode(LoadHubNode loadHub) { + protected void lowerLoadHubNode(LoadHubNode loadHub, LoweringTool tool) { StructuredGraph graph = loadHub.graph(); if (graph.getGuardsStage().allowsFloatingGuards()) { return; } - ValueNode hub = createReadHub(graph, loadHub.getValue(), loadHub.getGuard()); + ValueNode hub = createReadHub(graph, loadHub.getValue(), loadHub.getGuard(), tool); graph.replaceFloating(loadHub, hub); } @@ -672,9 +672,9 @@ return value; } - protected abstract ValueNode createReadHub(StructuredGraph graph, ValueNode object, GuardingNode guard); + protected abstract ValueNode createReadHub(StructuredGraph graph, ValueNode object, GuardingNode guard, LoweringTool tool); - protected abstract ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor); + protected abstract ValueNode createReadArrayComponentHub(StructuredGraph graph, ValueNode arrayHub, FixedNode anchor, LoweringTool tool); protected PiNode getBoundsCheckedIndex(AccessIndexedNode n, LoweringTool tool, GuardingNode[] nullCheckReturn) { StructuredGraph graph = n.graph();