Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tier 2 optimizer: refactor to reuse constant symbols #120325

Open
Fidget-Spinner opened this issue Jun 10, 2024 · 0 comments
Open

Tier 2 optimizer: refactor to reuse constant symbols #120325

Fidget-Spinner opened this issue Jun 10, 2024 · 0 comments
Assignees
Labels
performance Performance or resource usage type-feature A feature request or enhancement

Comments

@Fidget-Spinner
Copy link
Member

Fidget-Spinner commented Jun 10, 2024

Feature or enhancement

Proposal:

Right now the optimizer loses information across constant values. Say for example

def test_propagate_constants_sources(self):
    def thing(unused):
        x = 0
        for _ in range(100):
            x = 1
            y = Foo.attr + Foo.attr
            # Type information of `Foo_attr` is not propagated to here.
            z = Foo.attr + Foo.attr
        return x
    
    class Foo:
        attr = 1

    res, ex = self._run_with_optimizer(thing, 1)
    opnames = list(iter_opnames(ex))
    self.assertIsNotNone(ex)
    guard_type_version_count = opnames.count("_GUARD_BOTH_INT")
    # Test fails, because we insert 2 type guards instead of 1 (ie type information is not propagated, and guards are repeated)
    self.assertEqual(guard_type_version_count, 1)

After we promote Foo.attr to constants, we don't keep source information, so we don't keep track that the first Foo.attr is the same as the subsequent ones. Then LOAD_CONST_INLINE loads a brand new constant symbol each time, with no information.

https://github.com/python/cpython/blob/main/Python/optimizer_bytecodes.c#L422

A possible solution would be to keep some sort of ID for all constant promotions around.

Has this already been discussed elsewhere?

No response given

Links to previous discussion of this feature:

No response

@Fidget-Spinner Fidget-Spinner added type-feature A feature request or enhancement performance Performance or resource usage labels Jun 10, 2024
@Fidget-Spinner Fidget-Spinner self-assigned this Jun 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
performance Performance or resource usage type-feature A feature request or enhancement
1 participant