# HG changeset patch # User Bernhard Urban # Date 1365712733 -7200 # Node ID 2979aaac95afb236f2bb383e82b24a62358a3600 # Parent 23762f2438b65d576b60259aaec7f7ad6b164fc4 assumptions: enable NoFinalizableSubclass assumption diff -r 23762f2438b6 -r 2979aaac95af graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java Thu Apr 11 21:43:14 2013 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/Assumptions.java Thu Apr 11 22:38:53 2013 +0200 @@ -45,6 +45,40 @@ private static final long serialVersionUID = -1936652569665112915L; } + public static final class NoFinalizableSubclass extends Assumption { + + private static final long serialVersionUID = 6451169735564055081L; + + private ResolvedJavaType receiverType; + + public NoFinalizableSubclass(ResolvedJavaType receiverType) { + this.receiverType = receiverType; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + receiverType.hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof NoFinalizableSubclass) { + NoFinalizableSubclass other = (NoFinalizableSubclass) obj; + return other.receiverType == receiverType; + } + return false; + } + + @Override + public String toString() { + return "NoFinalizableSubclass[receiverType=" + toJavaName(receiverType) + "]"; + } + + } + /** * An assumption about a unique subtype of a given type. */ @@ -273,12 +307,10 @@ * Records an assumption that the specified type has no finalizable subclasses. * * @param receiverType the type that is assumed to have no finalizable subclasses - * @return {@code true} if the assumption was recorded and can be assumed; {@code false} - * otherwise */ - public boolean recordNoFinalizableSubclassAssumption(ResolvedJavaType receiverType) { + public void recordNoFinalizableSubclassAssumption(ResolvedJavaType receiverType) { assert useOptimisticAssumptions; - return false; + record(new NoFinalizableSubclass(receiverType)); } /** diff -r 23762f2438b6 -r 2979aaac95af graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Thu Apr 11 21:43:14 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/RegisterFinalizerNode.java Thu Apr 11 22:38:53 2013 +0200 @@ -65,7 +65,8 @@ } else if (stamp.type() != null && !stamp.type().hasFinalizableSubclass()) { // if either the declared type of receiver or the holder // can be assumed to have no finalizers - if (tool.assumptions().useOptimisticAssumptions() && tool.assumptions().recordNoFinalizableSubclassAssumption(stamp.type())) { + if (tool.assumptions().useOptimisticAssumptions()) { + tool.assumptions().recordNoFinalizableSubclassAssumption(stamp.type()); needsCheck = false; } } diff -r 23762f2438b6 -r 2979aaac95af src/share/vm/classfile/systemDictionary.hpp --- a/src/share/vm/classfile/systemDictionary.hpp Thu Apr 11 21:43:14 2013 +0200 +++ b/src/share/vm/classfile/systemDictionary.hpp Thu Apr 11 22:38:53 2013 +0200 @@ -199,6 +199,7 @@ /* graal.api.code */ \ do_klass(Assumptions_klass, com_oracle_graal_api_code_Assumptions, Opt) \ do_klass(Assumptions_ConcreteMethod_klass, com_oracle_graal_api_code_Assumptions_ConcreteMethod, Opt) \ + do_klass(Assumptions_NoFinalizableSubclass_klass, com_oracle_graal_api_code_Assumptions_NoFinalizableSubclass, Opt) \ do_klass(Assumptions_ConcreteSubtype_klass, com_oracle_graal_api_code_Assumptions_ConcreteSubtype, Opt) \ do_klass(Assumptions_MethodContents_klass, com_oracle_graal_api_code_Assumptions_MethodContents, Opt) \ do_klass(Assumptions_CallSiteTargetValue_klass, com_oracle_graal_api_code_Assumptions_CallSiteTargetValue, Opt) \ diff -r 23762f2438b6 -r 2979aaac95af src/share/vm/classfile/vmSymbols.hpp --- a/src/share/vm/classfile/vmSymbols.hpp Thu Apr 11 21:43:14 2013 +0200 +++ b/src/share/vm/classfile/vmSymbols.hpp Thu Apr 11 22:38:53 2013 +0200 @@ -322,6 +322,7 @@ template(com_oracle_graal_api_code_Assumptions, "com/oracle/graal/api/code/Assumptions") \ template(com_oracle_graal_api_code_Assumptions_MethodContents, "com/oracle/graal/api/code/Assumptions$MethodContents") \ template(com_oracle_graal_api_code_Assumptions_ConcreteSubtype, "com/oracle/graal/api/code/Assumptions$ConcreteSubtype") \ + template(com_oracle_graal_api_code_Assumptions_NoFinalizableSubclass, "com/oracle/graal/api/code/Assumptions$NoFinalizableSubclass") \ template(com_oracle_graal_api_code_Assumptions_ConcreteMethod, "com/oracle/graal/api/code/Assumptions$ConcreteMethod") \ template(com_oracle_graal_api_code_Assumptions_CallSiteTargetValue,"com/oracle/graal/api/code/Assumptions$CallSiteTargetValue") \ template(com_oracle_graal_api_code_CompilationResult, "com/oracle/graal/api/code/CompilationResult") \ diff -r 23762f2438b6 -r 2979aaac95af src/share/vm/code/dependencies.cpp --- a/src/share/vm/code/dependencies.cpp Thu Apr 11 21:43:14 2013 +0200 +++ b/src/share/vm/code/dependencies.cpp Thu Apr 11 22:38:53 2013 +0200 @@ -144,6 +144,11 @@ assert_common_1(evol_method, DepValue(_oop_recorder, m)); } +void Dependencies::assert_has_no_finalizable_subclasses(Klass* ctxk) { + check_ctxk(ctxk); + assert_common_1(no_finalizable_subclasses, DepValue(_oop_recorder, ctxk)); +} + void Dependencies::assert_leaf_type(Klass* ctxk) { if (ctxk->oop_is_array()) { // As a special case, support this assertion on an array type, diff -r 23762f2438b6 -r 2979aaac95af src/share/vm/code/dependencies.hpp --- a/src/share/vm/code/dependencies.hpp Thu Apr 11 21:43:14 2013 +0200 +++ b/src/share/vm/code/dependencies.hpp Thu Apr 11 22:38:53 2013 +0200 @@ -360,6 +360,7 @@ public: void assert_evol_method(Method* m); + void assert_has_no_finalizable_subclasses(Klass* ctxk); void assert_leaf_type(Klass* ctxk); void assert_unique_concrete_method(Klass* ctxk, Method* uniqm); void assert_abstract_with_unique_concrete_subtype(Klass* ctxk, Klass* conck); diff -r 23762f2438b6 -r 2979aaac95af src/share/vm/graal/graalCodeInstaller.cpp --- a/src/share/vm/graal/graalCodeInstaller.cpp Thu Apr 11 21:43:14 2013 +0200 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Thu Apr 11 22:38:53 2013 +0200 @@ -294,6 +294,8 @@ if (!assumption.is_null()) { if (assumption->klass() == Assumptions_MethodContents::klass()) { assumption_MethodContents(assumption); + } else if (assumption->klass() == Assumptions_NoFinalizableSubclass::klass()) { + assumption_NoFinalizableSubclass(assumption); } else if (assumption->klass() == Assumptions_ConcreteSubtype::klass()) { assumption_ConcreteSubtype(assumption); } else if (assumption->klass() == Assumptions_ConcreteMethod::klass()) { @@ -447,6 +449,12 @@ _dependencies->assert_evol_method(method()); } +void CodeInstaller::assumption_NoFinalizableSubclass(Handle assumption) { + Handle receiverType_handle = Assumptions_NoFinalizableSubclass::receiverType(assumption()); + Klass* receiverType = asKlass(HotSpotResolvedObjectType::metaspaceKlass(receiverType_handle)); + _dependencies->assert_has_no_finalizable_subclasses(receiverType); +} + void CodeInstaller::assumption_ConcreteSubtype(Handle assumption) { Handle context_handle = Assumptions_ConcreteSubtype::context(assumption()); Handle subtype_handle = Assumptions_ConcreteSubtype::subtype(assumption()); diff -r 23762f2438b6 -r 2979aaac95af src/share/vm/graal/graalCodeInstaller.hpp --- a/src/share/vm/graal/graalCodeInstaller.hpp Thu Apr 11 21:43:14 2013 +0200 +++ b/src/share/vm/graal/graalCodeInstaller.hpp Thu Apr 11 22:38:53 2013 +0200 @@ -93,6 +93,7 @@ void initialize_buffer(CodeBuffer& buffer); void assumption_MethodContents(Handle assumption); + void assumption_NoFinalizableSubclass(Handle assumption); void assumption_ConcreteSubtype(Handle assumption); void assumption_ConcreteMethod(Handle assumption); void assumption_CallSiteTargetValue(Handle assumption); diff -r 23762f2438b6 -r 2979aaac95af src/share/vm/graal/graalJavaAccess.hpp --- a/src/share/vm/graal/graalJavaAccess.hpp Thu Apr 11 21:43:14 2013 +0200 +++ b/src/share/vm/graal/graalJavaAccess.hpp Thu Apr 11 22:38:53 2013 +0200 @@ -110,6 +110,9 @@ start_class(Assumptions_MethodContents) \ oop_field(Assumptions_MethodContents, method, "Lcom/oracle/graal/api/meta/ResolvedJavaMethod;") \ end_class \ + start_class(Assumptions_NoFinalizableSubclass) \ + oop_field(Assumptions_NoFinalizableSubclass, receiverType, "Lcom/oracle/graal/api/meta/ResolvedJavaType;") \ + end_class \ start_class(Assumptions_ConcreteSubtype) \ oop_field(Assumptions_ConcreteSubtype, context, "Lcom/oracle/graal/api/meta/ResolvedJavaType;") \ oop_field(Assumptions_ConcreteSubtype, subtype, "Lcom/oracle/graal/api/meta/ResolvedJavaType;") \