diff --git a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java index 2217e3605d0b..2be0a929d188 100644 --- a/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java +++ b/compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/java/BytecodeParser.java @@ -3824,6 +3824,7 @@ private LoopBeginNode appendLoopBegin(FixedWithNextNode fixedWithNext, int start if (disableLoopSafepoint()) { loopBegin.disableSafepoint(SafepointState.MUST_NEVER_SAFEPOINT); loopBegin.disableGuestSafepoint(SafepointState.MUST_NEVER_SAFEPOINT); + loopBegin.disableLoopExitSafepoint(SafepointState.MUST_NEVER_SAFEPOINT); } fixedWithNext.setNext(preLoopEnd); // Add the single non-loop predecessor of the loop header. diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/phases/SubstrateSafepointInsertionPhase.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/phases/SubstrateSafepointInsertionPhase.java index f7700df0499e..1a6e0b22378a 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/phases/SubstrateSafepointInsertionPhase.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/phases/SubstrateSafepointInsertionPhase.java @@ -64,13 +64,19 @@ public static boolean needSafepointCheck(ResolvedJavaMethod method) { return true; } - @Override - protected void run(StructuredGraph graph, MidTierContext context) { + /** + * Determines if this (potentially special) method needs safepoint checks. + */ + public static boolean needsSafepointCheck(StructuredGraph graph) { SharedMethod method = (SharedMethod) graph.method(); - if (!method.needSafepointCheck()) { - return; - } + return method.needSafepointCheck(); + } + /** + * Insert SVM specific safepoints at the method end if necessary. + */ + public static void insertMethodEndSafepoints(StructuredGraph graph, MidTierContext context) { + SharedMethod method = (SharedMethod) graph.method(); if (!((SubstrateBackend) context.getTargetProvider()).safepointCheckedInEpilogue(method)) { /* Insert method-end safepoints. */ for (ReturnNode returnNode : graph.getNodes(ReturnNode.TYPE)) { @@ -78,6 +84,14 @@ protected void run(StructuredGraph graph, MidTierContext context) { graph.addBeforeFixed(returnNode, safepointNode); } } + } + + @Override + protected void run(StructuredGraph graph, MidTierContext context) { + if (!needsSafepointCheck(graph)) { + return; + } + insertMethodEndSafepoints(graph, context); /* Insert loop safepoints. */ super.run(graph, context);