diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/results/StrengthenGraphs.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/results/StrengthenGraphs.java index ca214f4442a3..eaeb35757679 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/results/StrengthenGraphs.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/results/StrengthenGraphs.java @@ -739,7 +739,8 @@ private void handleInvoke(Invoke invoke, SimplifierTool tool) { } } - if (allowOptimizeReturnParameter) { + if (allowOptimizeReturnParameter && (isClosedTypeWorld || callTarget.invokeKind().isDirect() || targetMethod.canBeStaticallyBound())) { + /* Can only optimize returned parameter when all possible callees are visible. */ optimizeReturnedParameter(callees, arguments, node, tool); } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java index d3462aea281f..9b40b1f71a6a 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedInstanceClass.java @@ -26,10 +26,8 @@ import com.oracle.graal.pointsto.meta.AnalysisType; -import jdk.vm.ci.meta.Assumptions.AssumptionResult; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.ResolvedJavaField; -import jdk.vm.ci.meta.ResolvedJavaMethod; public class HostedInstanceClass extends HostedClass { @@ -141,16 +139,4 @@ public void setIdentityHashOffset(int offset) { assert offset >= 0; this.identityHashOffset = offset; } - - @Override - public AssumptionResult findUniqueConcreteMethod(ResolvedJavaMethod m) { - if (m.canBeStaticallyBound() || universe.hostVM().isClosedTypeWorld()) { - return super.findUniqueConcreteMethod(m); - } - /* - * With an open type world analysis we cannot make assumptions for methods that cannot be - * trivially statically bound. - */ - return null; - } } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java index bfdd7004d9a3..25e5709110dd 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/meta/HostedType.java @@ -562,4 +562,16 @@ public ResolvedJavaType unwrapTowardsOriginalType() { public Class getJavaClass() { return OriginalClassProvider.getJavaClass(this); } + + @Override + public AssumptionResult findUniqueConcreteMethod(ResolvedJavaMethod m) { + if (m.canBeStaticallyBound() || universe.hostVM().isClosedTypeWorld()) { + return SharedType.super.findUniqueConcreteMethod(m); + } + /* + * With an open type world analysis we cannot make assumptions for methods that cannot be + * trivially statically bound. + */ + return null; + } }