Skip to content

gh-114058: The Tier2 Optimizer #114059

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

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
29db898
abstract interp
Fidget-Spinner Jan 13, 2024
c1332cc
the abstract interpreter
Fidget-Spinner Jan 13, 2024
9d85c35
cleanup
Fidget-Spinner Jan 13, 2024
76cee0c
run black
Fidget-Spinner Jan 13, 2024
b71aa06
the optimizer
Fidget-Spinner Jan 14, 2024
f0e5dec
fix a whole bunch of bugs
Fidget-Spinner Jan 14, 2024
52e368f
properly handle runtime self_or_null
Fidget-Spinner Jan 14, 2024
a273a2f
fix faulty assertion
Fidget-Spinner Jan 14, 2024
60a1d79
fix build
Fidget-Spinner Jan 15, 2024
7077ad5
fix all tests except test_capi and maybe test_ctypes
Fidget-Spinner Jan 16, 2024
5169bf3
run black and re-enable tests
Fidget-Spinner Jan 16, 2024
0929bb8
📜🤖 Added by blurb_it.
blurb-it[bot] Jan 16, 2024
70ee73e
Merge remote-tracking branch 'upstream/main' into tier2_abstract_inte…
Fidget-Spinner Jan 18, 2024
7d66440
check for buffer overruns
Fidget-Spinner Jan 18, 2024
6b18e30
expand the ir
Fidget-Spinner Jan 18, 2024
4b1dff4
fix return path
Fidget-Spinner Jan 18, 2024
6a61b18
fix some refleaks
Fidget-Spinner Jan 19, 2024
9e32f75
basic value numbering
Fidget-Spinner Jan 19, 2024
119548e
force enable uops
Fidget-Spinner Jan 19, 2024
27ce303
allow more memory
Fidget-Spinner Jan 19, 2024
8915762
fix some refleaks, test value numbering
Fidget-Spinner Jan 20, 2024
0974dad
fix all the warnings
Fidget-Spinner Jan 20, 2024
c9cd8a8
fix test
Fidget-Spinner Jan 20, 2024
eb56a90
fix refleak tests
Fidget-Spinner Jan 20, 2024
c9c7854
lint
Fidget-Spinner Jan 20, 2024
3e64d1f
get rid of all compiler warnings
Fidget-Spinner Jan 20, 2024
df3b938
fix smelly
Fidget-Spinner Jan 20, 2024
81a859b
add comments, cleanup
Fidget-Spinner Jan 20, 2024
7280281
exclude abstract interp cases from C analyzer
Fidget-Spinner Jan 20, 2024
ac6e29f
fix c-globals check
Fidget-Spinner Jan 20, 2024
9e5ef68
fix refleak
Fidget-Spinner Jan 24, 2024
1f27abb
peepholing, make _CHECK_PEP_523 a guard
Fidget-Spinner Jan 24, 2024
c88a8c6
fix bug
Fidget-Spinner Jan 24, 2024
307c66f
make things const?
Fidget-Spinner Jan 24, 2024
19ce538
allow for more scratch space, but keep traces same
Fidget-Spinner Jan 24, 2024
c701581
Merge remote-tracking branch 'upstream/main' into tier2_abstract_inte…
Fidget-Spinner Jan 24, 2024
3353996
fix upstream changes
Fidget-Spinner Jan 24, 2024
543c827
apply same peephole from upstream
Fidget-Spinner Jan 24, 2024
6e55480
fix eval frame
Fidget-Spinner Jan 24, 2024
4e74c5b
use uops as IR
Fidget-Spinner Jan 25, 2024
6829844
fix error cases
Fidget-Spinner Jan 25, 2024
1de0ccb
fix leak, fix peepholer
Fidget-Spinner Jan 25, 2024
d2917b7
documentation, cleanup whitespace
Fidget-Spinner Jan 25, 2024
553ac53
reduce mem usage
Fidget-Spinner Jan 25, 2024
4555b0c
remove INIT_FAST add ignored
Fidget-Spinner Jan 25, 2024
4155d84
cleanup
Fidget-Spinner Jan 25, 2024
e48a794
Add back peephole for constants
Fidget-Spinner Jan 25, 2024
7e7ba2d
fix compiler warning
Fidget-Spinner Jan 25, 2024
9aa7ccd
cut the constant factor
Fidget-Spinner Jan 25, 2024
d3d1e60
loop peeling
Fidget-Spinner Jan 25, 2024
d8d82e0
loop unrolling done
Fidget-Spinner Jan 25, 2024
9692146
peel only a single loops
Fidget-Spinner Jan 25, 2024
fe648e2
reorder to fix macos
Fidget-Spinner Jan 25, 2024
2dc0d0c
please fix mac
Fidget-Spinner Jan 25, 2024
b132a87
fix test
Fidget-Spinner Jan 25, 2024
8a726e0
slightly reduce dispatch overhead
Fidget-Spinner Jan 25, 2024
0d9df64
fixx off-by-one error
Fidget-Spinner Jan 25, 2024
a72d6ef
peel less aggressively, clear peepholer
Fidget-Spinner Jan 26, 2024
9599113
undo loop peeling
Fidget-Spinner Jan 26, 2024
7de4b37
Revert "undo loop peeling"
Fidget-Spinner Jan 26, 2024
acc6490
add more memory for everything
Fidget-Spinner Jan 26, 2024
cf59bba
peephole on failure
Fidget-Spinner Jan 26, 2024
41882ce
add stats collection
Fidget-Spinner Jan 27, 2024
797bc1e
Revert "add more memory for everything"
Fidget-Spinner Jan 27, 2024
22da280
remove bad redefinition
Fidget-Spinner Jan 27, 2024
64fa51c
Partially address Guido's review
Fidget-Spinner Jan 28, 2024
262f978
remove sym_copy_type_number
Fidget-Spinner Jan 28, 2024
4a9e2b4
remove symbolic value, use symbolic type
Fidget-Spinner Jan 28, 2024
5868fb8
rename confusing name
Fidget-Spinner Jan 28, 2024
5a3f44f
Address Guido's review, 4x function cache
Fidget-Spinner Jan 28, 2024
f450646
loop peel more often, add stats for loop peeling
Fidget-Spinner Jan 28, 2024
d226882
Add `(void)found` to silence compiler warning on L802
gvanrossum Jan 28, 2024
9a3585a
convert frame and context to non-PyObjects
Fidget-Spinner Jan 29, 2024
882b48c
add test for freed functions
Fidget-Spinner Jan 29, 2024
551466f
cleanup
Fidget-Spinner Jan 29, 2024
17a989c
general cleanups
Fidget-Spinner Jan 29, 2024
fcdc84c
make static
Fidget-Spinner Jan 29, 2024
065b8a4
add comment by Guido
Fidget-Spinner Jan 30, 2024
5be3458
Merge remote-tracking branch 'upstream/main' into tier2_abstract_inte…
Fidget-Spinner Jan 30, 2024
580dd14
fix _JUMP_ABSOLUTE
Fidget-Spinner Jan 28, 2024
d603792
remove unsued var
Fidget-Spinner Jan 30, 2024
f206bd0
use iterative instead of recursive
Fidget-Spinner Jan 30, 2024
17b4ae3
fix bad test on aarch64 linux
Fidget-Spinner Jan 30, 2024
913d95b
remove non-compliant test
Fidget-Spinner Jan 30, 2024
425b40d
fix compiler warnings
Fidget-Spinner Jan 30, 2024
2c884e2
low hanging fruit in Guido's review
Fidget-Spinner Jan 31, 2024
d7d8e8c
cleanup more
Fidget-Spinner Jan 31, 2024
47ee732
Remove abstractframe_dealloc, and frame->prev
Fidget-Spinner Jan 31, 2024
01fb224
update documentation
Fidget-Spinner Jan 31, 2024
63f8abd
remove peephole pass in happy case!
Fidget-Spinner Jan 31, 2024
784d171
bail to tier 1 on failure, remove peepholer altogether
Fidget-Spinner Jan 31, 2024
79ba2be
change error codes
Fidget-Spinner Jan 31, 2024
07ba964
Merge remote-tracking branch 'upstream/main' into tier2_abstract_inte…
Fidget-Spinner Feb 2, 2024
50154ad
Merge remote-tracking branch 'upstream/main' into tier2_abstract_inte…
Fidget-Spinner Feb 2, 2024
a0b58b1
Integrate the constant promoter
Fidget-Spinner Feb 2, 2024
4573fca
fix test
Fidget-Spinner Feb 2, 2024
2096a8a
try fix memleak?
Fidget-Spinner Feb 2, 2024
4ad2804
Revert "try fix memleak?"
Fidget-Spinner Feb 2, 2024
224f6b4
fix memleak for real
Fidget-Spinner Feb 2, 2024
b784617
add more constant prop tests for promoted globals
Fidget-Spinner Feb 2, 2024
2983553
refactor
Fidget-Spinner Feb 2, 2024
6a6b11f
Simplify codegen -- either types or consts, not both
Fidget-Spinner Feb 4, 2024
cfe1de0
cleanup, reduce memory usage even more
Fidget-Spinner Feb 4, 2024
5ad6211
remove more memory allocations
Fidget-Spinner Feb 4, 2024
73daf91
zero dynamic memory allocation
Fidget-Spinner Feb 4, 2024
cac3616
forgot return
Fidget-Spinner Feb 4, 2024
e7df93a
streamline frame creation
Fidget-Spinner Feb 4, 2024
65fae9a
more cleanup
Fidget-Spinner Feb 4, 2024
3fec959
fix bug in return code
Fidget-Spinner Feb 4, 2024
dde7d12
fix on MSVC
Fidget-Spinner Feb 4, 2024
04c902b
Add back constant evaluation
Fidget-Spinner Feb 4, 2024
05e93c2
cleanup
Fidget-Spinner Feb 4, 2024
55f9bcb
add type annotation
Fidget-Spinner Feb 4, 2024
0726766
make const zapping more error-proof
Fidget-Spinner Feb 4, 2024
a8adada
fix stack metadata
Fidget-Spinner Feb 4, 2024
ab60387
address reviews
Fidget-Spinner Feb 6, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ Programs/test_frozenmain.h generated
Python/Python-ast.c generated
Python/executor_cases.c.h generated
Python/generated_cases.c.h generated
Python/abstract_interp_cases.c.h generated
Python/opcode_targets.h generated
Python/stdlib_module_names.h generated
Tools/peg_generator/pegen/grammar_parser.py generated
Expand Down
8 changes: 8 additions & 0 deletions Include/cpython/pystats.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,14 @@ typedef struct _optimization_stats {
uint64_t trace_length_hist[_Py_UOP_HIST_SIZE];
uint64_t trace_run_length_hist[_Py_UOP_HIST_SIZE];
uint64_t optimized_trace_length_hist[_Py_UOP_HIST_SIZE];
uint64_t optimizer_attempts;
uint64_t optimizer_successes;
uint64_t optimizer_failure_reason_null_function;
uint64_t optimizer_failure_reason_no_memory;
uint64_t optimizer_failure_reason_no_writebuffer;
uint64_t loop_body_duplication_attempts;
uint64_t loop_body_duplication_successes;
uint64_t loop_body_duplication_no_mem;
} OptimizationStats;

typedef struct _rare_event_stats {
Expand Down
2 changes: 1 addition & 1 deletion Include/internal/pycore_function.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ extern PyObject* _PyFunction_Vectorcall(

#define FUNC_MAX_WATCHERS 8

#define FUNC_VERSION_CACHE_SIZE (1<<12) /* Must be a power of 2 */
#define FUNC_VERSION_CACHE_SIZE (1<<14) /* Must be a power of 2 */
struct _py_func_state {
uint32_t next_version;
// Borrowed references to function objects whose
Expand Down
16 changes: 9 additions & 7 deletions Include/internal/pycore_opcode_metadata.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions Include/internal/pycore_optimizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,21 @@ extern "C" {
# error "this header requires Py_BUILD_CORE define"
#endif

#include "pycore_uop_ids.h"

// This is the length of the trace we project initially.
#define UOP_MAX_TRACE_LENGTH 512
// This the above + additional working space we need.
#define UOP_MAX_TRACE_WORKING_LENGTH (UOP_MAX_TRACE_LENGTH * 2)
Comment on lines +15 to +16
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see this used in the code any more.


#define TRACE_STACK_SIZE 5

int _Py_uop_analyze_and_optimize(_PyInterpreterFrame *frame,
_PyUOpInstruction *trace, int trace_len, int curr_stackentries,
_PyBloomFilter *dependencies);



extern PyTypeObject _PyCounterExecutor_Type;
extern PyTypeObject _PyCounterOptimizer_Type;
extern PyTypeObject _PyDefaultOptimizer_Type;
Expand Down
21 changes: 12 additions & 9 deletions Include/internal/pycore_uop_ids.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading