mirror of
https://github.com/python/cpython.git
synced 2025-09-26 02:10:18 +00:00
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 ab61d3f430
.
This commit is contained in:
parent
d7d066c3ab
commit
a10f99375e
44 changed files with 1679 additions and 1460 deletions
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue