GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Specialization of some instructions does not conform to PEP 659, and prevents PEP 669 · Issue #100982 · python/cpython

Specialization of some instructions does not conform to PEP 659, and prevents PEP 669 #100982

New issue
Copy link
New issue
Copy link
Closed
Closed
Specialization of some instructions does not conform to PEP 659, and prevents PEP 669#100982
Copy link
Labels
interpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)performancePerformance or resource usagePerformance or resource usage

Description

@markshannon
markshannon
opened on Jan 12, 2023
Issue body actions

As written, PEP 659 says that individual specializations are restricted to a single instruction.
PEP 669 relies on this, as it also wants to replace instructions at runtime, and it would break if specialization occurs across multiple instructions.

Currently there are a two places where we break this design by specializing pairs of instructions together:

  • COMPARE_OP POP_JUMP_IF_ pairs are specialized together
  • FOR_ITER STORE_FAST are specialized together

The second will go away with the register VM, and doesn't seem to be an issue in practice.
It is the COMPARE_OP POP_JUMP_IF_ specialization that is problematic, as PEP 669 wants to instrument branches.
Instrumenting the POP_JUMP_IF_ doesn't work if the COMPARE_OP specialization jumps over it.

The solution is to replace the COMPARE_OP POP_JUMP_IF_ pair with a single COMPARE_AND_BRANCH instruction that can be specialized or instrumented atomically.

Linked PRs

  • GH-100982: Add COMPARE_AND_BRANCH instruction #100983
  • GH-100982: Restrict FOR_ITER_RANGE to a single instruction to allow instrumentation. #101985
  • GH-100982: Break up COMPARE_AND_BRANCH #102801

Activity

  1. markshannon
    added
    performancePerformance or resource usagePerformance or resource usage
    on Jan 12, 2023
  2. markshannon commented on Jan 12, 2023

    @markshannon
    markshannon
    on Jan 12, 2023
    MemberAuthor
    More actions

    Superinstructions are also a problem for PEP 669, but are simpler to handle, and will also go away with the register VM.

  3. markshannon
    added a commit that references this issue on Jan 16, 2023

    GH-100982: Add `COMPARE_AND_BRANCH` instruction (GH-100983)

    7b14c2e
  4. brandtbucher commented on Jan 18, 2023

    @brandtbucher
    brandtbucher
    on Jan 18, 2023
    Member
    More actions

    BINARY_OP_INPLACE_ADD_UNICODE and CALL_NO_KW_LIST_APPEND are two more examples of "adaptive superinstructions".

    Like FOR_ITER, though, they don't cross a branch and will probably disappear when we get a register VM.

  5. markshannon commented on Jan 27, 2023

    @markshannon
    markshannon
    on Jan 27, 2023
    MemberAuthor
    More actions

    https://github.com/python/cpython/pull/100983[)](https://github.com/python/cpython/commit/7b14c2ef194b6eed79670aa9d7e29ab8e2256a56) fixed the COMPARE_OP issue, so I'm retitling this issue.

  6. markshannon
    changed the title [-]Specialization of `COMPARE_OP` does not conform to PEP 659, and prevents PEP 669[/-] [+]Specialization of some instructions does not conform to PEP 659, and prevents PEP 669[/+] on Jan 27, 2023
  7. markshannon commented on Jan 27, 2023

    @markshannon
    markshannon
    on Jan 27, 2023
    MemberAuthor
    More actions

    Although BINARY_OP_INPLACE_ADD_UNICODE and CALL_NO_KW_LIST_APPEND don't cross boundaries they may cross lines which interferes with instrumentation for LINE events.

  8. markshannon commented on Jan 27, 2023

    @markshannon
    markshannon
    on Jan 27, 2023
    MemberAuthor
    More actions

    The instruction that is skipped in CALL_NO_KW_LIST_APPEND is always a POP_TOP.
    We can fix this by making sure that the POP_TOP following a call has no location. It probably should anyway.
    The compiler already gives POP_TOP NO_LOCATION so nothing to do here

    BINARY_OP_INPLACE_ADD_UNICODE is still a problem. It is rare, so the extra cost of de-specializing it during instrumentation and preventing that specialization if instrumentation is present would probably be OK.

    Note:
    This is only an issue for instrumentation of LINE events. INSTRUCTION events prevent all specialization, so there cannot be a conflict.

  9. markshannon commented on Jan 27, 2023

    @markshannon
    markshannon
    on Jan 27, 2023
    MemberAuthor
    More actions

    An alternative to fixing BINARY_OP_INPLACE_ADD_UNICODE is to restore the old behavior of BINARY_ADD to special case adding strings, and make sure that BINARY_OP specialization is so good that the performance of plain BINARY_ADD is irrelevant.

  10. markshannon commented on Jan 27, 2023

    @markshannon
    markshannon
    on Jan 27, 2023
    MemberAuthor
    More actions

    Which leaves FOR_ITER_RANGE. I'm hoping that improvements to freelists and integer representation will make the cost of creating the temporary int tolerable.

  11. markshannon
    added a commit that references this issue on Feb 22, 2023

    GH-100982: Restrict `FOR_ITER_RANGE` to a single instruction to allow…

    7c106a4
  12. carljm
    added a commit that references this issue on Feb 23, 2023

    Merge branch 'main' into lockfreecp

    b257a16
  13. brandtbucher
    added a commit that references this issue on Mar 23, 2023

    GH-100982: Break up COMPARE_AND_BRANCH (GH-102801)

    0444ae2
  14. Fidget-Spinner
    added a commit that references this issue on Mar 27, 2023

    pythonGH-100982: Break up COMPARE_AND_BRANCH (pythonGH-102801)

    6183cbd
  15. warsaw
    added a commit that references this issue on Apr 11, 2023

    pythonGH-100982: Break up COMPARE_AND_BRANCH (pythonGH-102801)

    73558f2
  16. gvanrossum commented on May 17, 2023

    @gvanrossum
    gvanrossum
    on May 17, 2023
    Member
    More actions
    • FOR_ITER STORE_FAST are specialized together

    The second will go away with the register VM, and doesn't seem to be an issue in practice.

    Since there is no register VM (and probably won't be one, or not for a long time), what should we do about this? Ignore it because it "doesn't seem to be an issue in practice"?

    OTOH maybe this issue can be closed, since it appears we do have PEP 669 after all? @markshannon

  17. markshannon commented on Jun 2, 2023

    @markshannon
    markshannon
    on Jun 2, 2023
    MemberAuthor
    More actions

    FOR_ITER and STORE_FAST are no longer specialized together (specifically for PEP 669): #101985

    So, yes this can be closed.

  18. markshannon
    closed this as completedon Jun 2, 2023
  19. markshannon
    reopened this on Jun 19, 2023
  20. markshannon commented on Jun 19, 2023

    @markshannon
    markshannon
    on Jun 19, 2023
    MemberAuthor
    More actions

    It looks like we never fixed up BINARY_OP_INPLACE_ADD_UNICODE

  21. iritkatriel
    added
    interpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)
    on Nov 27, 2023
  22. markshannon
    closed this as completedon Apr 2, 2024
  23. JelleZijlstra
    added a commit that references this issue on Sep 10, 2024

    pythonGH-100982: Restrict `FOR_ITER_RANGE` to a single instruction to…

    ee28e14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    interpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)performancePerformance or resource usagePerformance or resource usage

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      You are visitor 01402503 — GeezerVison does not store the pages you look up.
      Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.