< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.virtual/src/org/graalvm/compiler/virtual/phases/ea/PEReadEliminationBlockState.java

Print this page

        

*** 23,32 **** --- 23,34 ---- package org.graalvm.compiler.virtual.phases.ea; import java.util.Iterator; import java.util.List; + import org.graalvm.compiler.core.common.type.IntegerStamp; + import org.graalvm.compiler.core.common.type.Stamp; import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.nodes.FieldLocationIdentity; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.virtual.AllocatedObjectNode; import org.graalvm.compiler.nodes.virtual.VirtualInstanceNode;
*** 47,61 **** public final LocationIdentity identity; public final ValueNode object; public final int index; public final JavaKind kind; ! ReadCacheEntry(LocationIdentity identity, ValueNode object, int index, JavaKind kind) { this.identity = identity; this.object = object; this.index = index; this.kind = kind; } @Override public int hashCode() { int result = 31 + ((identity == null) ? 0 : identity.hashCode()); --- 49,67 ---- public final LocationIdentity identity; public final ValueNode object; public final int index; public final JavaKind kind; ! /* This flag does not affect hashCode or equals implementations. */ ! public final boolean overflowAccess; ! ! ReadCacheEntry(LocationIdentity identity, ValueNode object, int index, JavaKind kind, boolean overflowAccess) { this.identity = identity; this.object = object; this.index = index; this.kind = kind; + this.overflowAccess = overflowAccess; } @Override public int hashCode() { int result = 31 + ((identity == null) ? 0 : identity.hashCode());
*** 92,107 **** @Override public String toString() { return super.toString() + " " + readCache; } @Override protected void objectMaterialized(VirtualObjectNode virtual, AllocatedObjectNode representation, List<ValueNode> values) { if (virtual instanceof VirtualInstanceNode) { VirtualInstanceNode instance = (VirtualInstanceNode) virtual; for (int i = 0; i < instance.entryCount(); i++) { ! readCache.put(new ReadCacheEntry(new FieldLocationIdentity(instance.field(i)), representation, -1, instance.field(i).getJavaKind()), values.get(i)); } } } @Override --- 98,139 ---- @Override public String toString() { return super.toString() + " " + readCache; } + private static JavaKind stampToJavaKind(Stamp stamp) { + if (stamp instanceof IntegerStamp) { + switch (((IntegerStamp) stamp).getBits()) { + case 1: + return JavaKind.Boolean; + case 8: + return JavaKind.Byte; + case 16: + return ((IntegerStamp) stamp).isPositive() ? JavaKind.Char : JavaKind.Short; + case 32: + return JavaKind.Int; + case 64: + return JavaKind.Long; + default: + throw new IllegalArgumentException("unexpected IntegerStamp " + stamp); + } + } else { + return stamp.getStackKind(); + } + } + @Override protected void objectMaterialized(VirtualObjectNode virtual, AllocatedObjectNode representation, List<ValueNode> values) { if (virtual instanceof VirtualInstanceNode) { VirtualInstanceNode instance = (VirtualInstanceNode) virtual; for (int i = 0; i < instance.entryCount(); i++) { ! JavaKind declaredKind = instance.field(i).getJavaKind(); ! if (declaredKind == stampToJavaKind(values.get(i).stamp())) { ! // We won't cache unaligned field writes upon instantiation unless we add ! // support for non-array objects in PEReadEliminationClosure.processUnsafeLoad. ! readCache.put(new ReadCacheEntry(new FieldLocationIdentity(instance.field(i)), representation, -1, declaredKind, false), values.get(i)); ! } } } } @Override
*** 110,129 **** return false; } return super.equivalentTo(other); } ! public void addReadCache(ValueNode object, LocationIdentity identity, int index, JavaKind kind, ValueNode value, PartialEscapeClosure<?> closure) { ValueNode cacheObject; ObjectState obj = closure.getObjectState(this, object); if (obj != null) { assert !obj.isVirtual(); cacheObject = obj.getMaterializedValue(); } else { cacheObject = object; } ! readCache.put(new ReadCacheEntry(identity, cacheObject, index, kind), value); } public ValueNode getReadCache(ValueNode object, LocationIdentity identity, int index, JavaKind kind, PartialEscapeClosure<?> closure) { ValueNode cacheObject; ObjectState obj = closure.getObjectState(this, object); --- 142,161 ---- return false; } return super.equivalentTo(other); } ! public void addReadCache(ValueNode object, LocationIdentity identity, int index, JavaKind kind, boolean overflowAccess, ValueNode value, PartialEscapeClosure<?> closure) { ValueNode cacheObject; ObjectState obj = closure.getObjectState(this, object); if (obj != null) { assert !obj.isVirtual(); cacheObject = obj.getMaterializedValue(); } else { cacheObject = object; } ! readCache.put(new ReadCacheEntry(identity, cacheObject, index, kind, overflowAccess), value); } public ValueNode getReadCache(ValueNode object, LocationIdentity identity, int index, JavaKind kind, PartialEscapeClosure<?> closure) { ValueNode cacheObject; ObjectState obj = closure.getObjectState(this, object);
*** 131,141 **** assert !obj.isVirtual() : object; cacheObject = obj.getMaterializedValue(); } else { cacheObject = object; } ! ValueNode cacheValue = readCache.get(new ReadCacheEntry(identity, cacheObject, index, kind)); obj = closure.getObjectState(this, cacheValue); if (obj != null) { assert !obj.isVirtual(); cacheValue = obj.getMaterializedValue(); } else { --- 163,173 ---- assert !obj.isVirtual() : object; cacheObject = obj.getMaterializedValue(); } else { cacheObject = object; } ! ValueNode cacheValue = readCache.get(new ReadCacheEntry(identity, cacheObject, index, kind, false)); obj = closure.getObjectState(this, cacheValue); if (obj != null) { assert !obj.isVirtual(); cacheValue = obj.getMaterializedValue(); } else {
*** 151,161 **** public void killReadCache(LocationIdentity identity, int index) { Iterator<ReadCacheEntry> iter = readCache.getKeys().iterator(); while (iter.hasNext()) { ReadCacheEntry entry = iter.next(); ! if (entry.identity.equals(identity) && (index == -1 || entry.index == -1 || index == entry.index)) { iter.remove(); } } } --- 183,193 ---- public void killReadCache(LocationIdentity identity, int index) { Iterator<ReadCacheEntry> iter = readCache.getKeys().iterator(); while (iter.hasNext()) { ReadCacheEntry entry = iter.next(); ! if (entry.identity.equals(identity) && (index == -1 || entry.index == -1 || index == entry.index || entry.overflowAccess)) { iter.remove(); } } }
< prev index next >