Tier 2 optimizer: refactor to reuse constant symbols
@Fidget-Spinner ci sta già lavorando.
Dal 11/6/2024.
- Lingua principale
- Python
- Stelle
- 77.2k
- Fork
- 35.9k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Valutazione
Questa issue non è ancora stata valutata.