8050887: Intrinsify constants for default values

Reviewed-by: vlivanov, psandoz
This commit is contained in:
John Rose 2014-09-10 19:19:50 +04:00 committed by Vladimir Ivanov
parent 9c80853676
commit 70c6eaee97
3 changed files with 31 additions and 2 deletions

View File

@ -668,6 +668,10 @@ class InvokerBytecodeGenerator {
assert(name.arguments.length == 1);
emitPushArguments(name);
continue;
case ZERO:
assert(name.arguments.length == 0);
emitConst(name.type.basicTypeWrapper().zero());
continue;
case NONE:
// no intrinsic associated
break;

View File

@ -1054,6 +1054,7 @@ import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
ARRAY_LOAD,
ARRAY_STORE,
IDENTITY,
ZERO,
NONE // no intrinsic associated
}

View File

@ -2184,9 +2184,14 @@ assert((int)twice.invokeExact(21) == 42);
if (type == void.class)
throw newIllegalArgumentException("void type");
Wrapper w = Wrapper.forPrimitiveType(type);
return insertArguments(identity(type), 0, w.convert(value, type));
value = w.convert(value, type);
if (w.zero().equals(value))
return zero(w, type);
return insertArguments(identity(type), 0, value);
} else {
return identity(type).bindTo(type.cast(value));
if (value == null)
return zero(Wrapper.OBJECT, type);
return identity(type).bindTo(value);
}
}
@ -2217,6 +2222,25 @@ assert((int)twice.invokeExact(21) == 42);
LambdaForm lform = LambdaForm.identityForm(BasicType.basicType(ptype));
return MethodHandleImpl.makeIntrinsic(mtype, lform, Intrinsic.IDENTITY);
}
private static MethodHandle zero(Wrapper btw, Class<?> rtype) {
int pos = btw.ordinal();
MethodHandle zero = ZERO_MHS[pos];
if (zero == null) {
zero = setCachedMethodHandle(ZERO_MHS, pos, makeZero(btw.primitiveType()));
}
if (zero.type().returnType() == rtype)
return zero;
assert(btw == Wrapper.OBJECT);
return makeZero(rtype);
}
private static final MethodHandle[] ZERO_MHS = new MethodHandle[Wrapper.values().length];
private static MethodHandle makeZero(Class<?> rtype) {
MethodType mtype = MethodType.methodType(rtype);
LambdaForm lform = LambdaForm.zeroForm(BasicType.basicType(rtype));
return MethodHandleImpl.makeIntrinsic(mtype, lform, Intrinsic.ZERO);
}
synchronized private static MethodHandle setCachedMethodHandle(MethodHandle[] cache, int pos, MethodHandle value) {
// Simulate a CAS, to avoid racy duplication of results.
MethodHandle prev = cache[pos];