Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions Python/generated_cases.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Tools/cases_generator/optimizer_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ def write_uop(
local = locals[var.name]
else:
local = Local.local(var)
out.emit(stack.push(local))
stack.push(local)
out.start_line()
stack.flush(out, cast_type="_Py_UopsSymbol *", extract_bits=True)
except StackError as ex:
Expand Down
41 changes: 13 additions & 28 deletions Tools/cases_generator/stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ def __init__(self) -> None:
self.variables: list[Local] = []
self.defined: set[str] = set()


def pop(self, var: StackItem, extract_bits: bool = False) -> tuple[str, Local]:
self.top_offset.pop(var)
indirect = "&" if var.is_array() else ""
Expand All @@ -188,25 +189,18 @@ def pop(self, var: StackItem, extract_bits: bool = False) -> tuple[str, Local]:
if not var.used:
return "", popped
self.defined.add(var.name)
# Always define array variables as it is free, and their offset might have changed
if var.is_array():
return (
f"{var.name} = &stack_pointer[{self.top_offset.to_c()}];\n",
Local.redefinition(var, popped)
)
if not popped.defined:
return (
f"{var.name} = stack_pointer[{self.top_offset.to_c()}];\n",
Local.redefinition(var, popped)
)
else:
if popped.defined:
if popped.name == var.name:
return "", popped
else:
return (
f"{var.name} = {popped.name};\n",
Local.redefinition(var, popped)
)
defn = f"{var.name} = {popped.name};\n"
else:
if var.is_array():
defn = f"{var.name} = &stack_pointer[{self.top_offset.to_c()}];\n"
else:
defn = f"{var.name} = stack_pointer[{self.top_offset.to_c()}];\n"
return defn, Local.redefinition(var, popped)

self.base_offset.pop(var)
if var.name in UNUSED or not var.used:
return "", Local.unused(var)
Expand All @@ -228,21 +222,12 @@ def pop(self, var: StackItem, extract_bits: bool = False) -> tuple[str, Local]:
in_memory = var.is_array() or var.peek
return assign, Local(var, not var.is_array(), in_memory, True)

def push(self, var: Local) -> str:
def push(self, var: Local) -> None:
self.variables.append(var)
if var.is_array() and not var.defined and var.item.used:
assert var.in_memory
assert not var.cached
c_offset = self.top_offset.to_c()
self.top_offset.push(var.item)
self.top_offset.push(var.item)
if var.item.used:
self.defined.add(var.name)
var.defined = True
return f"{var.name} = &stack_pointer[{c_offset}];\n"
else:
self.top_offset.push(var.item)
if var.item.used:
self.defined.add(var.name)
return ""

def define_output_arrays(self, outputs: list[StackItem]) -> str:
res = []
Expand Down
2 changes: 1 addition & 1 deletion Tools/cases_generator/tier1_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ def write_uop(
local = Local.unused(var)
else:
local = Local.local(var)
emitter.emit(stack.push(local))
stack.push(local)
if braces:
emitter.out.start_line()
emitter.emit("}\n")
Expand Down
2 changes: 1 addition & 1 deletion Tools/cases_generator/tier2_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> None:
local = locals[var.name]
else:
local = Local.local(var)
emitter.emit(stack.push(local))
stack.push(local)
except StackError as ex:
raise analysis_error(ex.args[0], uop.body[0]) from None

Expand Down