GH-131498: Another refactoring of the code generator (GH-131827)

* Rename 'defined' attribute to 'in_local' to more accurately reflect how it is used

* Make death of variables explicit even for array variables.

* Convert in_memory from boolean to stack offset

* Don't apply liveness analyis to optimizer generated code

* Add 'out' parameter to stack.pop
This commit is contained in:
Mark Shannon 2025-03-31 13:52:48 +01:00 committed by GitHub
parent ba11f45dd9
commit c535a132e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 206 additions and 212 deletions

View file

@ -34,11 +34,11 @@
def declare_variable(
var: StackItem, uop: Uop, required: set[str], out: CWriter
var: StackItem, uop: Uop, seen: set[str], out: CWriter
) -> None:
if not var.used or var.name not in required:
if not var.used or var.name in seen:
return
required.remove(var.name)
seen.add(var.name)
type, null = type_and_null(var)
space = " " if type[-1].isalnum() else ""
out.emit(f"{type}{space}{var.name};\n")
@ -46,16 +46,16 @@ def declare_variable(
def declare_variables(uop: Uop, out: CWriter) -> None:
stack = Stack()
null = CWriter.null()
for var in reversed(uop.stack.inputs):
stack.pop(var)
stack.pop(var, null)
for var in uop.stack.outputs:
stack.push(Local.undefined(var))
required = set(stack.defined)
required.discard("unused")
seen = {"unused"}
for var in reversed(uop.stack.inputs):
declare_variable(var, uop, required, out)
declare_variable(var, uop, seen, out)
for var in uop.stack.outputs:
declare_variable(var, uop, required, out)
declare_variable(var, uop, seen, out)
class Tier2Emitter(Emitter):
@ -143,9 +143,7 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
elif uop.properties.const_oparg >= 0:
emitter.emit(f"oparg = {uop.properties.const_oparg};\n")
emitter.emit(f"assert(oparg == CURRENT_OPARG());\n")
code_list, storage = Storage.for_uop(stack, uop)
for code in code_list:
emitter.emit(code)
storage = Storage.for_uop(stack, uop, emitter.out)
idx = 0
for cache in uop.caches:
if cache.name != "unused":