Mercurial > hg > graal-compiler
changeset 13593:24353c21ef34
slightly better (denser) Class.isArray check
author | twisti |
---|---|
date | Fri, 10 Jan 2014 19:30:45 -0800 |
parents | 805a904eae8f |
children | fcabc0da42b0 |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java |
diffstat | 3 files changed, 21 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Fri Jan 10 17:47:16 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Fri Jan 10 19:30:45 2014 -0800 @@ -1101,11 +1101,6 @@ return (layoutHelperArrayTagTypeValue & ~layoutHelperArrayTagObjectValue) << layoutHelperArrayTagShift; } - /** - * Bit pattern in the klass layout helper that can be used to identify arrays. - */ - public final int arrayKlassLayoutHelperIdentifier = 0x80000000; - @HotSpotVMField(name = "ArrayKlass::_component_mirror", type = "oop", get = HotSpotVMField.Type.OFFSET) @Stable public int arrayKlassComponentMirrorOffset; @HotSpotVMField(name = "java_lang_Class::_klass_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int klassOffset; @@ -1320,7 +1315,8 @@ } assert codeEntryAlignment > 0 : codeEntryAlignment; - assert (layoutHelperArrayTagObjectValue & layoutHelperArrayTagTypeValue & arrayKlassLayoutHelperIdentifier) != 0 : "object array and type array must have first bit set"; + assert (layoutHelperArrayTagObjectValue & (1 << (Integer.SIZE - 1))) != 0 : "object array must have first bit set"; + assert (layoutHelperArrayTagTypeValue & (1 << (Integer.SIZE - 1))) != 0 : "type array must have first bit set"; return true; }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java Fri Jan 10 17:47:16 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ClassSubstitutions.java Fri Jan 10 19:30:45 2014 -0800 @@ -71,7 +71,7 @@ if (klass.equal(0)) { return false; } else { - return (readLayoutHelper(klass) & arrayKlassLayoutHelperIdentifier()) != 0; + return klassIsArray(klass); } } @@ -89,7 +89,7 @@ if (klass.notEqual(0)) { int accessFlags = klass.readInt(klassAccessFlagsOffset(), LocationIdentity.FINAL_LOCATION); if ((accessFlags & Modifier.INTERFACE) == 0) { - if ((readLayoutHelper(klass) & arrayKlassLayoutHelperIdentifier()) != 0) { + if (klassIsArray(klass)) { return Object.class; } else { Word superKlass = klass.readWord(klassSuperKlassOffset(), LocationIdentity.FINAL_LOCATION); @@ -109,7 +109,7 @@ public static Class<?> getComponentType(final Class<?> thisObj) { Word klass = loadWordFromObject(thisObj, klassOffset()); if (klass.notEqual(0)) { - if ((readLayoutHelper(klass) & arrayKlassLayoutHelperIdentifier()) != 0) { + if (klassIsArray(klass)) { return piCast(klass.readObject(arrayKlassComponentMirrorOffset(), LocationIdentity.FINAL_LOCATION), Class.class, true, true); } }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Fri Jan 10 17:47:16 2014 -0800 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotReplacementsUtil.java Fri Jan 10 19:30:45 2014 -0800 @@ -237,9 +237,22 @@ return hub.readInt(klassLayoutHelperOffset(), LocationIdentity.FINAL_LOCATION); } - @Fold - public static int arrayKlassLayoutHelperIdentifier() { - return config().arrayKlassLayoutHelperIdentifier; + /** + * Checks if class {@code klass} is an array. + * + * See: Klass::layout_helper_is_array + * + * @param klass the class to be checked + * @return true if klass is an array, false otherwise + */ + public static boolean klassIsArray(Word klass) { + /* + * The less-than check only works if both values are ints. We use local variables to make + * sure these are still ints and haven't changed. + */ + final int layoutHelper = readLayoutHelper(klass); + final int layoutHelperNeutralValue = config().klassLayoutHelperNeutralValue; + return (layoutHelper < layoutHelperNeutralValue); } @Fold