Skip to content

Commit 933dec4

Browse files
committed
[GR-40746] Report loop counts for and in OSR targets and prioritize them with a bonus.
1 parent 8e0b9db commit 933dec4

File tree

5 files changed

+31
-8
lines changed

5 files changed

+31
-8
lines changed

truffle/docs/Options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ These are internal options for debugging language implementations and tools.
171171
- `--engine.TraversingQueueFirstTierBonus=[0.0, inf)` : Controls how much of a priority should be given to first tier compilations (default 15.0).
172172
- `--engine.TraversingQueueFirstTierPriority` : Traversing queue gives first tier compilations priority.
173173
- `--engine.TraversingQueueInvalidatedBonus=[0.0, inf)` : Controls how much of a priority should be given to compilations after invalidations (default: 1.0, no bonus).
174+
- `--engine.TraversingQueueOSRBonus=[0.0, inf)` : Controls how much of a priority should be given to OSR compilations (default: 1.0, no bonus).
174175
- `--engine.TraversingQueueWeightingBothTiers=true|false` : Traversing queue uses rate as priority for both tier. (default: true)
175176
- `--compiler.DiagnoseFailure` : Forces diagnostics for compilation failures (default: false).
176177
- `--compiler.ExcludeAssertions` : Exclude assertion code from Truffle compilations (default: true)

truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/BytecodeOSRMetadata.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -264,13 +264,19 @@ Object tryOSR(long target, Object interpreterState, Runnable beforeTransfer, Vir
264264
requestOSRCompilation(target, lockedTarget, (FrameWithoutBoxing) parentFrame);
265265
stage = HOT_STAGE;
266266
}
267+
// Set the OSR target's loop count to the count of the non OSR call target
268+
OptimizedCallTarget nonOSRCallTarget = (OptimizedCallTarget) ((Node) osrNode).getRootNode().getCallTarget();
269+
lockedTarget.onLoopCount(nonOSRCallTarget.getCallAndLoopCount());
267270
}
268271
return lockedTarget;
269272
});
270273
}
271274

272275
// Case 1: code is still being compiled
273276
if (callTarget.isCompiling()) {
277+
// Report loop count to the OSR target. Since this function is called every
278+
// OSR_POLL_INTERVAL times, OSR_POLL_INTERVAL is reported as a loop count
279+
callTarget.onLoopCount(OSR_POLL_INTERVAL);
274280
return null;
275281
}
276282
// Case 2: code is compiled and valid

truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/CompilationTask.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,6 @@ boolean isHigherPriorityThan(CompilationTask other) {
256256
// Any non-compilation action (e.g. compiler init) is higher priority.
257257
return action != COMPILATION_ACTION;
258258
}
259-
if ((this.isOSR ^ other.isOSR) && this.isLastTier() && other.isLastTier()) {
260-
// Any OSR task has higher priority than any non-OSR last tier task
261-
return this.isOSR;
262-
}
263259
int tier = tier();
264260
if (engineData.traversingFirstTierPriority && tier != other.tier()) {
265261
return tier < other.tier();
@@ -319,20 +315,34 @@ private double bonus() {
319315
// This bonus is 1.0 by default, i.e. it has no effect.
320316
bonus *= engineData.traversingInvalidatedBonus;
321317
}
318+
if (isOSR) {
319+
// Boost OSR tasks' priority. This bonus is 1.0 by default, i.e. it has no effect.
320+
bonus *= engineData.traversingOSRBonus;
321+
}
322322
return bonus;
323323
}
324324

325325
public List<String> bonusDescriptors() {
326-
List<String> bonuses = new ArrayList<>(2);
327-
if (!engineData.traversingFirstTierPriority && isFirstTier()) {
326+
List<String> bonuses = new ArrayList<>(3);
327+
if (!engineData.traversingFirstTierPriority && isFirstTier() && hasEffect(engineData.traversingFirstTierBonus)) {
328328
bonuses.add("first tier");
329329
}
330-
if (targetHighestCompiledTier() >= tier()) {
330+
if (targetHighestCompiledTier() >= tier() && hasEffect(engineData.traversingInvalidatedBonus)) {
331331
bonuses.add("invalidation");
332332
}
333+
if (isOSR && hasEffect(engineData.traversingOSRBonus)) {
334+
bonuses.add("OSR");
335+
}
333336
return bonuses;
334337
}
335338

339+
private static final double EPSILON = 1E-6;
340+
341+
private static boolean hasEffect(double bonus) {
342+
// Checks if the given bonus differs from 1.
343+
return Math.abs(bonus - 1.0) > EPSILON;
344+
}
345+
336346
private double rate(int count, long elapsed) {
337347
// Divide by a minimum of 1000 to prevent division by zero/very small numbers.
338348
return lastRate = ((double) count - lastCount) / Math.max(elapsed, 1000);

truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/EngineData.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import static com.oracle.truffle.runtime.OptimizedRuntimeOptions.TraversingQueueFirstTierBonus;
8080
import static com.oracle.truffle.runtime.OptimizedRuntimeOptions.TraversingQueueFirstTierPriority;
8181
import static com.oracle.truffle.runtime.OptimizedRuntimeOptions.TraversingQueueInvalidatedBonus;
82+
import static com.oracle.truffle.runtime.OptimizedRuntimeOptions.TraversingQueueOSRBonus;
8283
import static com.oracle.truffle.runtime.OptimizedRuntimeOptions.TraversingQueueWeightingBothTiers;
8384
import static com.oracle.truffle.runtime.OptimizedTruffleRuntime.getRuntime;
8485

@@ -160,6 +161,7 @@ public final class EngineData {
160161
@CompilationFinal public boolean traversingFirstTierPriority;
161162
@CompilationFinal public double traversingFirstTierBonus;
162163
@CompilationFinal public double traversingInvalidatedBonus;
164+
@CompilationFinal public double traversingOSRBonus;
163165
@CompilationFinal public boolean propagateCallAndLoopCount;
164166
@CompilationFinal public int propagateCallAndLoopCountMaxDepth;
165167
@CompilationFinal public int maximumCompilations;
@@ -322,6 +324,7 @@ private void loadOptions(OptionValues options, SandboxPolicy sandboxPolicy) {
322324
traversingFirstTierBonus = options.get(TraversingQueueFirstTierBonus) * options.get(LastTierCompilationThreshold) / options.get(FirstTierCompilationThreshold);
323325
maximumCompilations = options.get(MaximumCompilations);
324326
traversingInvalidatedBonus = options.get(TraversingQueueInvalidatedBonus);
327+
traversingOSRBonus = options.get(TraversingQueueOSRBonus);
325328

326329
this.returnTypeSpeculation = options.get(ReturnTypeSpeculation);
327330
this.argumentTypeSpeculation = options.get(ArgumentTypeSpeculation);

truffle/src/com.oracle.truffle.runtime/src/com/oracle/truffle/runtime/OptimizedRuntimeOptions.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ public EngineModeEnum apply(String s) {
336336
@Option(help = "Controls how much of a priority should be given to compilations after invalidations (default: 1.0, no bonus).", usageSyntax = "[0.0, inf)", category = OptionCategory.INTERNAL) //
337337
public static final OptionKey<Double> TraversingQueueInvalidatedBonus = new OptionKey<>(1.0);
338338

339+
@Option(help = "Controls how much of a priority should be given to OSR compilations (default: 1.0, no bonus).", usageSyntax = "[0.0, inf)", category = OptionCategory.INTERNAL) //
340+
public static final OptionKey<Double> TraversingQueueOSRBonus = new OptionKey<>(1.0);
341+
339342
@Option(help = "Traversing queue uses rate as priority for both tier. (default: true)", usageSyntax = "true|false", category = OptionCategory.INTERNAL) //
340343
public static final OptionKey<Boolean> TraversingQueueWeightingBothTiers = new OptionKey<>(true);
341344

0 commit comments

Comments
 (0)