diff options
author | Sam Gross <colesbury@gmail.com> | 2025-01-23 09:26:25 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-23 09:26:25 (GMT) |
commit | a10f99375e7912df863cf101a38e9703cfcd72f1 (patch) | |
tree | 7909c7896fe256427c1149d2416fb7912ad3ba48 /Tools/cases_generator/stack.py | |
parent | d7d066c3ab6842117f9e0fb1c9dde4bce00fa1e3 (diff) | |
download | cpython-a10f99375e7912df863cf101a38e9703cfcd72f1.zip cpython-a10f99375e7912df863cf101a38e9703cfcd72f1.tar.gz cpython-a10f99375e7912df863cf101a38e9703cfcd72f1.tar.bz2 |
Revert "GH-128914: Remove conditional stack effects from `bytecodes.c` and the code generators (GH-128918)" (GH-129202)
The commit introduced a ~2.5-3% regression in the free threading build.
This reverts commit ab61d3f4303d14a413bc9ae6557c730ffdf7579e.
Diffstat (limited to 'Tools/cases_generator/stack.py')
-rw-r--r-- | Tools/cases_generator/stack.py | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/Tools/cases_generator/stack.py b/Tools/cases_generator/stack.py index 4e9a312..5121837 100644 --- a/Tools/cases_generator/stack.py +++ b/Tools/cases_generator/stack.py @@ -24,7 +24,17 @@ def maybe_parenthesize(sym: str) -> str: def var_size(var: StackItem) -> str: - if var.size: + if var.condition: + # Special case simplifications + if var.condition == "0": + return "0" + elif var.condition == "1": + return var.get_size() + elif var.condition == "oparg & 1" and not var.size: + return f"({var.condition})" + else: + return f"(({var.condition}) ? {var.get_size()} : 0)" + elif var.size: return var.size else: return "1" @@ -80,6 +90,10 @@ class Local: def name(self) -> str: return self.item.name + @property + def condition(self) -> str | None: + return self.item.condition + def is_array(self) -> bool: return self.item.is_array() @@ -260,7 +274,16 @@ class Stack: self.defined.add(var.name) cast = f"({var.type})" if (not indirect and var.type) else "" bits = ".bits" if cast and self.extract_bits else "" - assign = f"{var.name} = {cast}{indirect}stack_pointer[{self.base_offset.to_c()}]{bits};\n" + assign = f"{var.name} = {cast}{indirect}stack_pointer[{self.base_offset.to_c()}]{bits};" + if var.condition: + if var.condition == "1": + assign = f"{assign}\n" + elif var.condition == "0": + return "", Local.unused(var) + else: + assign = f"if ({var.condition}) {{ {assign} }}\n" + else: + assign = f"{assign}\n" return assign, Local.from_memory(var) def push(self, var: Local) -> None: @@ -280,6 +303,10 @@ class Stack: ) -> None: cast = f"({cast_type})" if var.type else "" bits = ".bits" if cast and extract_bits else "" + if var.condition == "0": + return + if var.condition and var.condition != "1": + out.emit(f"if ({var.condition}) ") out.emit(f"stack_pointer[{base_offset.to_c()}]{bits} = {cast}{var.name};\n") def _adjust_stack_pointer(self, out: CWriter, number: str) -> None: |