Skip to content

LOAD_FAST_BORROW not being used even when safe to do so, if value is live at BB end. #133672

Description

@markshannon

This function

def f(x, y, c):
return 1 + (x if c else y)

compiles to

 1 RESUME 0
2 LOAD_SMALL_INT 1
LOAD_FAST_BORROW 2 (c)
TO_BOOL
POP_JUMP_IF_FALSE 9 (to L1)
NOT_TAKEN
LOAD_FAST_BORROW 0 (x)
BINARY_OP 0 (+)
RETURN_VALUE
L1: LOAD_FAST 1 (y)
BINARY_OP 0 (+)
RETURN_VALUE

Note that the load of y uses LOAD_FAST even though LOAD_FAST_BORROW is safe.

This becomes important with virtual iterators as the iterable for the loop is live at BB end.

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.15pre-release feature fixes, bugs and security fixesinterpreter-core(Objects, Python, Grammar, and Parser dirs)performancePerformance or resource usagetype-featureA feature request or enhancement

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions