aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Tools
diff options
context:
space:
mode:
Diffstat (limited to 'Tools')
-rw-r--r--Tools/cases_generator/generators_common.py11
-rw-r--r--Tools/cases_generator/optimizer_generator.py1
-rw-r--r--Tools/jit/_targets.py10
-rw-r--r--Tools/requirements-hypothesis.txt2
4 files changed, 18 insertions, 6 deletions
diff --git a/Tools/cases_generator/generators_common.py b/Tools/cases_generator/generators_common.py
index 47de205c0e9..4c210fbf8d2 100644
--- a/Tools/cases_generator/generators_common.py
+++ b/Tools/cases_generator/generators_common.py
@@ -106,8 +106,9 @@ class Emitter:
out: CWriter
labels: dict[str, Label]
_replacers: dict[str, ReplacementFunctionType]
+ cannot_escape: bool
- def __init__(self, out: CWriter, labels: dict[str, Label]):
+ def __init__(self, out: CWriter, labels: dict[str, Label], cannot_escape: bool = False):
self._replacers = {
"EXIT_IF": self.exit_if,
"DEOPT_IF": self.deopt_if,
@@ -127,6 +128,7 @@ class Emitter:
}
self.out = out
self.labels = labels
+ self.cannot_escape = cannot_escape
def dispatch(
self,
@@ -238,7 +240,8 @@ class Emitter:
next(tkn_iter)
self._print_storage("DECREF_INPUTS", storage)
try:
- storage.close_inputs(self.out)
+ if not self.cannot_escape:
+ storage.close_inputs(self.out)
except StackError as ex:
raise analysis_error(ex.args[0], tkn)
except Exception as ex:
@@ -476,7 +479,7 @@ class Emitter:
reachable = True
tkn = stmt.contents[-1]
try:
- if stmt in uop.properties.escaping_calls:
+ if stmt in uop.properties.escaping_calls and not self.cannot_escape:
escape = uop.properties.escaping_calls[stmt]
if escape.kills is not None:
self.stackref_kill(escape.kills, storage, True)
@@ -513,7 +516,7 @@ class Emitter:
self.out.emit(tkn)
else:
self.out.emit(tkn)
- if stmt in uop.properties.escaping_calls:
+ if stmt in uop.properties.escaping_calls and not self.cannot_escape:
self.emit_reload(storage)
return reachable, None, storage
except StackError as ex:
diff --git a/Tools/cases_generator/optimizer_generator.py b/Tools/cases_generator/optimizer_generator.py
index 4556b6d5a74..81ae534bdda 100644
--- a/Tools/cases_generator/optimizer_generator.py
+++ b/Tools/cases_generator/optimizer_generator.py
@@ -245,6 +245,7 @@ class OptimizerConstantEmitter(OptimizerEmitter):
outp.name: self.emit_stackref_override for outp in self.original_uop.stack.outputs
}
self._replacers = {**self._replacers, **overrides}
+ self.cannot_escape = True
def emit_to_with_replacement(
self,
diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py
index ed10329d25d..728f48128ce 100644
--- a/Tools/jit/_targets.py
+++ b/Tools/jit/_targets.py
@@ -137,7 +137,15 @@ class _Target(typing.Generic[_S, _R]):
f"-I{CPYTHON / 'Include' / 'internal' / 'mimalloc'}",
f"-I{CPYTHON / 'Python'}",
f"-I{CPYTHON / 'Tools' / 'jit'}",
- "-O3",
+ # -O2 and -O3 include some optimizations that make sense for
+ # standalone functions, but not for snippets of code that are going
+ # to be laid out end-to-end (like ours)... common examples include
+ # passes like tail-duplication, or aligning jump targets with nops.
+ # -Os is equivalent to -O2 with many of these problematic passes
+ # disabled. Based on manual review, for *our* purposes it usually
+ # generates better code than -O2 (and -O2 usually generates better
+ # code than -O3). As a nice benefit, it uses less memory too:
+ "-Os",
"-S",
# Shorten full absolute file paths in the generated code (like the
# __FILE__ macro and assert failure messages) for reproducibility:
diff --git a/Tools/requirements-hypothesis.txt b/Tools/requirements-hypothesis.txt
index 66898885c0a..e5deac497fb 100644
--- a/Tools/requirements-hypothesis.txt
+++ b/Tools/requirements-hypothesis.txt
@@ -1,4 +1,4 @@
# Requirements file for hypothesis that
# we use to run our property-based tests in CI.
-hypothesis==6.111.2
+hypothesis==6.135.26