summaryrefslogtreecommitdiffstats
path: root/Python/generated_cases.c.h
diff options
context:
space:
mode:
Diffstat (limited to 'Python/generated_cases.c.h')
-rw-r--r--Python/generated_cases.c.h23
1 files changed, 18 insertions, 5 deletions
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 1c85304..b9a2b22 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -3409,10 +3409,12 @@
JUMPBY(-oparg);
#if ENABLE_SPECIALIZATION
this_instr[1].cache += (1 << OPTIMIZER_BITS_IN_COUNTER);
- if (this_instr[1].cache > tstate->interp->optimizer_backedge_threshold &&
- // Double-check that the opcode isn't instrumented or something:
- this_instr->op.code == JUMP_BACKWARD)
- {
+ /* We are using unsigned values, but we really want signed values, so
+ * do the 2s complement comparison manually */
+ uint16_t ucounter = this_instr[1].cache + (1 << 15);
+ uint16_t threshold = tstate->interp->optimizer_backedge_threshold + (1 << 15);
+ // Double-check that the opcode isn't instrumented or something:
+ if (ucounter > threshold && this_instr->op.code == JUMP_BACKWARD) {
OPT_STAT_INC(attempts);
int optimized = _PyOptimizer_BackEdge(frame, this_instr, next_instr, stack_pointer);
if (optimized < 0) goto error;
@@ -3420,8 +3422,19 @@
// Rewind and enter the executor:
assert(this_instr->op.code == ENTER_EXECUTOR);
next_instr = this_instr;
+ this_instr[1].cache &= ((1 << OPTIMIZER_BITS_IN_COUNTER) - 1);
+ }
+ else {
+ int backoff = this_instr[1].cache & ((1 << OPTIMIZER_BITS_IN_COUNTER) - 1);
+ if (backoff < MINIMUM_TIER2_BACKOFF) {
+ backoff = MINIMUM_TIER2_BACKOFF;
+ }
+ else if (backoff < 15 - OPTIMIZER_BITS_IN_COUNTER) {
+ backoff++;
+ }
+ assert(backoff <= 15 - OPTIMIZER_BITS_IN_COUNTER);
+ this_instr[1].cache = ((1 << 16) - ((1 << OPTIMIZER_BITS_IN_COUNTER) << backoff)) | backoff;
}
- this_instr[1].cache &= ((1 << OPTIMIZER_BITS_IN_COUNTER) - 1);
}
#endif /* ENABLE_SPECIALIZATION */
DISPATCH();