GH-131513: Cases generator: Allow dead inputs to be reassigned (GH-131515)

This commit is contained in:
Mark Shannon
2025-03-21 11:38:17 +00:00
committed by GitHub
parent b70d45ab22
commit d3f6063af1
4 changed files with 71 additions and 17 deletions

View File

@@ -177,7 +177,7 @@ class Uop:
stack: StackEffect
caches: list[CacheEntry]
deferred_refs: dict[lexer.Token, str | None]
output_stores: list[lexer.Token]
local_stores: list[lexer.Token]
body: list[lexer.Token]
properties: Properties
_size: int = -1
@@ -236,7 +236,7 @@ class Label:
self.properties = properties
size:int = 0
output_stores: list[lexer.Token] = []
local_stores: list[lexer.Token] = []
instruction_size = None
def __str__(self) -> str:
@@ -431,7 +431,7 @@ def find_assignment_target(node: parser.InstDef, idx: int) -> list[lexer.Token]:
return []
def find_stores_outputs(node: parser.InstDef) -> list[lexer.Token]:
def find_variable_stores(node: parser.InstDef) -> list[lexer.Token]:
res: list[lexer.Token] = []
outnames = { out.name for out in node.outputs }
innames = { out.name for out in node.inputs }
@@ -449,9 +449,7 @@ def find_stores_outputs(node: parser.InstDef) -> list[lexer.Token]:
if len(lhs) != 1 or lhs[0].kind != "IDENTIFIER":
continue
name = lhs[0]
if name.text in innames:
raise analysis_error(f"Cannot assign to input variable '{name.text}'", name)
if name.text in outnames:
if name.text in outnames or name.text in innames:
res.append(name)
return res
@@ -877,7 +875,7 @@ def make_uop(
stack=analyze_stack(op),
caches=analyze_caches(inputs),
deferred_refs=analyze_deferred_refs(op),
output_stores=find_stores_outputs(op),
local_stores=find_variable_stores(op),
body=op.block.tokens,
properties=compute_properties(op),
)
@@ -899,7 +897,7 @@ def make_uop(
stack=analyze_stack(op),
caches=analyze_caches(inputs),
deferred_refs=analyze_deferred_refs(op),
output_stores=find_stores_outputs(op),
local_stores=find_variable_stores(op),
body=op.block.tokens,
properties=properties,
)

View File

@@ -262,7 +262,7 @@ class Emitter:
next(tkn_iter)
next(tkn_iter)
for var in storage.inputs:
var.defined = False
var.kill()
return True
def kill(
@@ -280,7 +280,7 @@ class Emitter:
next(tkn_iter)
for var in storage.inputs:
if var.name == name:
var.defined = False
var.kill()
break
else:
raise analysis_error(
@@ -301,7 +301,7 @@ class Emitter:
raise analysis_error(
f"Cannot close '{name.text}' when "
f"'{live}' is still live", name)
var.defined = False
var.kill()
break
if var.defined:
live = var.name
@@ -526,7 +526,7 @@ class Emitter:
) -> tuple[bool, Token, Storage]:
""" Returns (reachable?, closing '}', stack)."""
braces = 1
out_stores = set(uop.output_stores)
local_stores = set(uop.local_stores)
tkn = next(tkn_iter)
reload: Token | None = None
try:
@@ -574,11 +574,19 @@ class Emitter:
if not self._replacers[tkn.text](tkn, tkn_iter, uop, storage, inst):
reachable = False
else:
if tkn in out_stores:
for out in storage.outputs:
if out.name == tkn.text:
out.defined = True
out.in_memory = False
if tkn in local_stores:
for var in storage.inputs:
if var.name == tkn.text:
if var.defined 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
break
for var in storage.outputs:
if var.name == tkn.text:
var.defined = True
var.in_memory = False
break
if tkn.text.startswith("DISPATCH"):
self._print_storage(storage)

View File

@@ -63,6 +63,10 @@ class Local:
def from_memory(defn: StackItem) -> "Local":
return Local(defn, True, True, True)
def kill(self) -> None:
self.defined = False
self.in_memory = False
def copy(self) -> "Local":
return Local(
self.item,