From a00e13cd418d6a113a202e6c5be4149ba99716a6 Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Sun, 16 Jan 2022 18:27:45 -0800 Subject: [PATCH 1/2] WIP speed up pywriter by caching stuff more and not deepcopying currently broken --- src/openpower/decoder/pseudo/parser.py | 35 ++++++++++++++++---------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/openpower/decoder/pseudo/parser.py b/src/openpower/decoder/pseudo/parser.py index 0c4628d6..de266840 100644 --- a/src/openpower/decoder/pseudo/parser.py +++ b/src/openpower/decoder/pseudo/parser.py @@ -916,21 +916,31 @@ class PowerParser: raise SyntaxError(p) +_CACHE_DECODER = True +_CACHED_DECODER = None + + +def _create_cached_decoder(): + global _CACHED_DECODER + if _CACHE_DECODER: + if _CACHED_DECODER is None: + _CACHED_DECODER = create_pdecode() + return _CACHED_DECODER + return create_pdecode() + + class GardenSnakeParser(PowerParser): - def __init__(self, lexer=None, debug=False, form=None, incl_carry=False, helper=False): + def __init__(self, debug=False, form=None, incl_carry=False, helper=False): if form is not None: - self.sd = create_pdecode() + self.sd = _create_cached_decoder() PowerParser.__init__(self, form, incl_carry, helper=helper) self.debug = debug - if lexer is None: - lexer = IndentLexer(debug=0) - self.lexer = lexer - self.tokens = lexer.tokens + self.lexer = IndentLexer(debug=0) + self.tokens = self.lexer.tokens self.parser = yacc.yacc(module=self, start="file_input_end", debug=debug, write_tables=False) def parse(self, code): - # self.lexer.input(code) result = self.parser.parse(code, lexer=self.lexer, debug=self.debug) if self.helper: result = [ast.ClassDef("ISACallerFnHelper", [ @@ -950,13 +960,12 @@ class GardenSnakeCompiler(object): def __init__(self, debug=False, form=None, incl_carry=False, helper=False): if _CACHE_PARSERS: try: - parser = _CACHED_PARSERS[debug, form, incl_carry, helper] + self.parser = _CACHED_PARSERS[debug, form, incl_carry, helper] except KeyError: - parser = GardenSnakeParser(debug=debug, form=form, - incl_carry=incl_carry, helper=helper) - _CACHED_PARSERS[debug, form, incl_carry, helper] = parser - - self.parser = deepcopy(parser) + self.parser = GardenSnakeParser( + debug=debug, form=form, incl_carry=incl_carry, + helper=helper) + _CACHED_PARSERS[debug, form, incl_carry, helper] = self.parser else: self.parser = GardenSnakeParser(debug=debug, form=form, incl_carry=incl_carry, helper=helper) -- 2.30.2 From c1b1380f8245bd0726a2892809299e0f079cd288 Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Mon, 17 Jan 2022 16:32:39 -0800 Subject: [PATCH 2/2] speed up pywriter --- src/openpower/decoder/pseudo/parser.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/openpower/decoder/pseudo/parser.py b/src/openpower/decoder/pseudo/parser.py index de266840..51fd100a 100644 --- a/src/openpower/decoder/pseudo/parser.py +++ b/src/openpower/decoder/pseudo/parser.py @@ -288,12 +288,10 @@ class PowerParser: ("left", "INVERT"), ) - def __init__(self, form, include_carry_in_write=False, helper=False): - self.include_ca_in_write = include_carry_in_write - self.helper = helper + def reset(self): self.gprs = {} - if form is not None: - form = self.sd.sigforms[form] + if self.form is not None: + form = self.sd.sigforms[self.form] print(form) formkeys = form._asdict().keys() else: @@ -315,6 +313,12 @@ class PowerParser: self.write_regs = OrderedSet() self.special_regs = OrderedSet() # see p_atom_name + def __init__(self, form, include_carry_in_write=False, helper=False): + self.include_ca_in_write = include_carry_in_write + self.helper = helper + self.form = form + self.reset() + # The grammar comments come from Python's Grammar/Grammar file # NB: compound_stmt in single_input is followed by extra NEWLINE! @@ -941,6 +945,7 @@ class GardenSnakeParser(PowerParser): debug=debug, write_tables=False) def parse(self, code): + self.reset() result = self.parser.parse(code, lexer=self.lexer, debug=self.debug) if self.helper: result = [ast.ClassDef("ISACallerFnHelper", [ -- 2.30.2