diff options
Diffstat (limited to 'Tools/cases_generator/stack.py')
-rw-r--r-- | Tools/cases_generator/stack.py | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/Tools/cases_generator/stack.py b/Tools/cases_generator/stack.py index 14d06948ba1..ff1e2ea74db 100644 --- a/Tools/cases_generator/stack.py +++ b/Tools/cases_generator/stack.py @@ -283,7 +283,7 @@ class Stack: self.base_offset = self.logical_sp def push(self, var: Local) -> None: - assert(var not in self.variables) + assert(var not in self.variables), var self.variables.append(var) self.logical_sp = self.logical_sp.push(var.item) @@ -325,6 +325,7 @@ class Stack: var_offset = var_offset.push(var.item) def flush(self, out: CWriter) -> None: + self._print(out) self.save_variables(out) self._save_physical_sp(out) out.start_line() @@ -432,12 +433,14 @@ class Storage: stack: Stack inputs: list[Local] outputs: list[Local] + peeks: int check_liveness: bool spilled: int = 0 @staticmethod def needs_defining(var: Local) -> bool: return ( + not var.item.peek and not var.in_local and not var.is_array() and var.name != "unused" @@ -454,7 +457,7 @@ class Storage: ) def clear_inputs(self, reason:str) -> None: - while self.inputs: + while len(self.inputs) > self.peeks: tos = self.inputs.pop() if self.is_live(tos) and self.check_liveness: raise StackError( @@ -464,14 +467,14 @@ class Storage: def clear_dead_inputs(self) -> None: live = "" - while self.inputs: + while len(self.inputs) > self.peeks: tos = self.inputs[-1] if self.is_live(tos): live = tos.name break self.inputs.pop() self.stack.drop(tos.item, self.check_liveness) - for var in self.inputs: + for var in self.inputs[self.peeks:]: if not self.is_live(var): raise StackError( f"Input '{var.name}' is not live, but '{live}' is" @@ -493,8 +496,8 @@ class Storage: f"Expected '{undefined}' to be defined before '{out.name}'" else: undefined = out.name - while self.outputs and not self.needs_defining(self.outputs[0]): - out = self.outputs.pop(0) + while len(self.outputs) > self.peeks and not self.needs_defining(self.outputs[0]): + out = self.outputs.pop(self.peeks) self.stack.push(out) def locals_cached(self) -> bool: @@ -541,12 +544,9 @@ class Storage: local = stack.pop(input, out) if input.peek: peeks.append(local) - else: - inputs.append(local) + inputs.append(local) inputs.reverse() peeks.reverse() - for peek in peeks: - stack.push(peek) offset = stack.logical_sp - stack.physical_sp for ouput in uop.stack.outputs: if ouput.is_array() and ouput.used and not ouput.peek: @@ -555,8 +555,8 @@ class Storage: offset = offset.push(ouput) for var in inputs: stack.push(var) - outputs = [ Local.undefined(var) for var in uop.stack.outputs if not var.peek ] - return Storage(stack, inputs, outputs, check_liveness) + outputs = peeks + [ Local.undefined(var) for var in uop.stack.outputs if not var.peek ] + return Storage(stack, inputs, outputs, len(peeks), check_liveness) @staticmethod def copy_list(arg: list[Local]) -> list[Local]: @@ -568,7 +568,7 @@ class Storage: inputs = [ variables[var.name] for var in self.inputs] assert [v.name for v in inputs] == [v.name for v in self.inputs], (inputs, self.inputs) return Storage( - new_stack, inputs, self.copy_list(self.outputs), + new_stack, inputs, self.copy_list(self.outputs), self.peeks, self.check_liveness, self.spilled ) @@ -602,6 +602,8 @@ class Storage: other.clear_dead_inputs() if len(self.inputs) != len(other.inputs) and self.check_liveness: diff = self.inputs[-1] if len(self.inputs) > len(other.inputs) else other.inputs[-1] + self._print(out) + other._print(out) raise StackError(f"Unmergeable inputs. Differing state of '{diff.name}'") for var, other_var in zip(self.inputs, other.inputs): if var.in_local != other_var.in_local: @@ -624,11 +626,11 @@ class Storage: if self.spilled: raise StackError(f"Unbalanced stack spills") self.clear_inputs("at the end of the micro-op") - if self.inputs and self.check_liveness: + if len(self.inputs) > self.peeks and self.check_liveness: raise StackError(f"Input variable '{self.inputs[-1].name}' is still live") self._push_defined_outputs() if self.outputs: - for out in self.outputs: + for out in self.outputs[self.peeks:]: if self.needs_defining(out): raise StackError(f"Output variable '{self.outputs[0].name}' is not defined") self.stack.push(out) @@ -641,6 +643,10 @@ class Storage: outputs = ", ".join([var.compact_str() for var in self.outputs]) return f"{stack_comment[:-2]}{next_line}inputs: {inputs} outputs: {outputs}*/" + def _print(self, out: CWriter) -> None: + if PRINT_STACKS: + out.emit(self.as_comment() + "\n") + def close_inputs(self, out: CWriter) -> None: tmp_defined = False |