cpython/Tools/cases_generator
Guido van Rossum bcce5e2718
gh-109039: Branch prediction for Tier 2 interpreter (#109038)
This adds a 16-bit inline cache entry to the conditional branch instructions POP_JUMP_IF_{FALSE,TRUE,NONE,NOT_NONE} and their instrumented variants, which is used to keep track of the branch direction.

Each time we encounter these instructions we shift the cache entry left by one and set the bottom bit to whether we jumped.

Then when it's time to translate such a branch to Tier 2 uops, we use the bit count from the cache entry to decided whether to continue translating the "didn't jump" branch or the "jumped" branch.

The counter is initialized to a pattern of alternating ones and zeros to avoid bias.

The .pyc file magic number is updated. There's a new test, some fixes for existing tests, and a few miscellaneous cleanups.
2023-09-11 18:20:24 +00:00
..
_typing_backports.py gh-104504: cases generator: Add --warn-unreachable to the mypy config (#108112) 2023-08-21 00:40:41 +01:00
analysis.py gh-107557: Remove unnecessary SAVE_IP instructions (#108583) 2023-08-29 16:51:51 +00:00
flags.py gh-107557: Remove unnecessary SAVE_IP instructions (#108583) 2023-08-29 16:51:51 +00:00
formatting.py gh-104504: Run mypy on cases_generator in CI (and blacken the code) (gh-108090) 2023-08-18 22:42:45 +09:00
generate_cases.py gh-109039: Branch prediction for Tier 2 interpreter (#109038) 2023-09-11 18:20:24 +00:00
instructions.py GH-108614: Add RESUME_CHECK instruction (GH-108630) 2023-09-07 14:39:03 +01:00
interpreter_definition.md gh-106812: Small stack effect fixes (#107759) 2023-08-07 21:32:42 -07:00
lexer.py gh-104504: Run mypy on cases_generator in CI (and blacken the code) (gh-108090) 2023-08-18 22:42:45 +09:00
mypy.ini gh-104504: Cases generator: enable mypy's possibly-undefined error code (#108454) 2023-08-25 18:08:29 +01:00
parsing.py GH-108614: Add RESUME_CHECK instruction (GH-108630) 2023-09-07 14:39:03 +01:00
plexer.py gh-106812: Refactor cases_generator to allow uops with array stack effects (#107564) 2023-08-04 09:35:56 -07:00
README.md Update README for the cases generator (#107826) 2023-08-10 01:05:51 +00:00
stacking.py gh-106581: Support multiple uops pushing new values (#108895) 2023-09-05 13:58:39 -07:00

Tooling to generate interpreters

Documentation for the instruction definitions in Python/bytecodes.c ("the DSL") is here.

What's currently here:

  • lexer.py: lexer for C, originally written by Mark Shannon
  • plexer.py: OO interface on top of lexer.py; main class: PLexer
  • parsing.py: Parser for instruction definition DSL; main class Parser
  • generate_cases.py: driver script to read Python/bytecodes.c and write Python/generated_cases.c.h (and several other files)
  • analysis.py: Analyzer class used to read the input files
  • flags.py: abstractions related to metadata flags for instructions
  • formatting.py: Formatter class used to write the output files
  • instructions.py: classes to analyze and write instructions
  • stacking.py: code to handle generalized stack effects

Note that there is some dummy C code at the top and bottom of Python/bytecodes.c to fool text editors like VS Code into believing this is valid C code.

A bit about the parser

The parser class uses a pretty standard recursive descent scheme, but with unlimited backtracking. The PLexer class tokenizes the entire input before parsing starts. We do not run the C preprocessor. Each parsing method returns either an AST node (a Node instance) or None, or raises SyntaxError (showing the error in the C source).

Most parsing methods are decorated with @contextual, which automatically resets the tokenizer input position when None is returned. Parsing methods may also raise SyntaxError, which is irrecoverable. When a parsing method returns None, it is possible that after backtracking a different parsing method returns a valid AST.

Neither the lexer nor the parsers are complete or fully correct. Most known issues are tersely indicated by # TODO: comments. We plan to fix issues as they become relevant.