diff -r 0152ad7b38b8 -r 6df94ce3ab2f src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopSafepointEliminationPhase.java --- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopSafepointEliminationPhase.java Tue Sep 24 08:54:08 2019 -0700 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopSafepointEliminationPhase.java Tue Sep 24 12:47:15 2019 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,18 +40,24 @@ @Override protected void run(StructuredGraph graph, MidTierContext context) { LoopsData loops = new LoopsData(graph); - if (context.getOptimisticOptimizations().useLoopLimitChecks(graph.getOptions()) && graph.getGuardsStage().allowsFloatingGuards()) { - loops.detectedCountedLoops(); - for (LoopEx loop : loops.countedLoops()) { - if (loop.loop().getChildren().isEmpty() && loop.counted().getStamp().getBits() <= 32) { - boolean hasSafepoint = false; - for (LoopEndNode loopEnd : loop.loopBegin().loopEnds()) { - hasSafepoint |= loopEnd.canSafepoint(); + loops.detectedCountedLoops(); + for (LoopEx loop : loops.countedLoops()) { + if (loop.loop().getChildren().isEmpty() && loop.counted().getStamp().getBits() <= 32) { + boolean hasSafepoint = false; + for (LoopEndNode loopEnd : loop.loopBegin().loopEnds()) { + hasSafepoint |= loopEnd.canSafepoint(); + } + if (hasSafepoint) { + if (!loop.counted().counterNeverOverflows()) { + // Counter can overflow, need to create a guard. + if (context.getOptimisticOptimizations().useLoopLimitChecks(graph.getOptions()) && graph.getGuardsStage().allowsFloatingGuards()) { + loop.counted().createOverFlowGuard(); + } else { + // Cannot disable this safepoint, because the loop could overflow. + continue; + } } - if (hasSafepoint) { - loop.counted().createOverFlowGuard(); - loop.loopBegin().disableSafepoint(); - } + loop.loopBegin().disableSafepoint(); } } }