mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
GH-131729: Code-gen better liveness analysis (GH-131732)
* 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 analysis to optimizer generated code * Fix RETURN_VALUE in optimizer
This commit is contained in:
parent
b9ca438daa
commit
1b8bb1ed0c
12 changed files with 344 additions and 399 deletions
|
@ -248,6 +248,7 @@ class Emitter:
|
|||
except Exception as ex:
|
||||
ex.args = (ex.args[0] + str(tkn),)
|
||||
raise
|
||||
self._print_storage(storage)
|
||||
return True
|
||||
|
||||
def kill_inputs(
|
||||
|
@ -303,7 +304,7 @@ class Emitter:
|
|||
f"'{live}' is still live", name)
|
||||
var.kill()
|
||||
break
|
||||
if var.defined:
|
||||
if var.in_local:
|
||||
live = var.name
|
||||
return True
|
||||
|
||||
|
@ -402,6 +403,7 @@ class Emitter:
|
|||
self.out.emit(")")
|
||||
|
||||
def emit_save(self, storage: Storage) -> None:
|
||||
storage.flush(self.out)
|
||||
storage.save(self.out)
|
||||
self._print_storage(storage)
|
||||
|
||||
|
@ -498,6 +500,9 @@ class Emitter:
|
|||
else:
|
||||
if PRINT_STACKS:
|
||||
self.emit("/* Merge */\n")
|
||||
self.out.emit(if_storage.as_comment())
|
||||
self.out.emit("\n")
|
||||
self.out.emit(else_storage.as_comment())
|
||||
else_storage.merge(if_storage, self.out)
|
||||
storage = else_storage
|
||||
self._print_storage(storage)
|
||||
|
@ -513,7 +518,7 @@ class Emitter:
|
|||
reachable = True
|
||||
except StackError as ex:
|
||||
self._print_storage(if_storage)
|
||||
raise analysis_error(ex.args[0], rbrace) # from None
|
||||
raise analysis_error(ex.args[0], rbrace) from None
|
||||
return reachable, rbrace, storage
|
||||
|
||||
def _emit_block(
|
||||
|
@ -577,16 +582,16 @@ class Emitter:
|
|||
if tkn in local_stores:
|
||||
for var in storage.inputs:
|
||||
if var.name == tkn.text:
|
||||
if var.defined or var.in_memory:
|
||||
if var.in_local or var.in_memory():
|
||||
msg = f"Cannot assign to already defined input variable '{tkn.text}'"
|
||||
raise analysis_error(msg, tkn)
|
||||
var.defined = True
|
||||
var.in_memory = False
|
||||
var.in_local = True
|
||||
var.memory_offset = None
|
||||
break
|
||||
for var in storage.outputs:
|
||||
if var.name == tkn.text:
|
||||
var.defined = True
|
||||
var.in_memory = False
|
||||
var.in_local = True
|
||||
var.memory_offset = None
|
||||
break
|
||||
if tkn.text.startswith("DISPATCH"):
|
||||
self._print_storage(storage)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue