From 6dc906f6d05d0cabd965c2114862002f6eda2772 Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Wed, 16 Apr 2025 02:51:55 +0800 Subject: [PATCH 01/11] gh-131798: Add JIT path for _BUILD_STRING Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 21 +++++++++++++++++++++ Python/optimizer_cases.c.h | 32 ++++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 8e1eacfec83e95..5fc89fc7e53c64 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -919,6 +919,27 @@ dummy_func(void) { tup = sym_new_tuple(ctx, oparg, values); } + op(_BUILD_SLICE, (value -- slice)) { + if (sym_is_const(ctx, value)) { + PyObject *val = sym_get_const(ctx, value); + slice = sym_new_const(ctx, val); + Py_DecRef(val); + } + else { + slice = sym_new_type(ctx, &PySlice_Type); + } + } + op(_BUILD_STRING, (value -- str)) { + if (sym_is_const(ctx, value)) { + PyObject *val = sym_get_const(ctx, value); + str = sym_new_const(ctx, val); + Py_DecRef(val); + } + else { + str = sym_new_type(ctx, &PyUnicode_Type); + } + } + op(_UNPACK_SEQUENCE_TWO_TUPLE, (seq -- val1, val0)) { val0 = sym_tuple_getitem(ctx, seq, 0); val1 = sym_tuple_getitem(ctx, seq, 1); diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 6a20cef906242b..6c4665de3cf696 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1010,11 +1010,19 @@ } case _BUILD_STRING: { + JitOptSymbol *value; JitOptSymbol *str; - str = sym_new_not_null(ctx); - stack_pointer[-oparg] = str; - stack_pointer += 1 - oparg; - assert(WITHIN_STACK_BOUNDS()); + value = stack_pointer[-1]; + if (sym_is_const(ctx, value)) { + PyObject *val = sym_get_const(ctx, value); + str = sym_new_const(ctx, val); + stack_pointer[-1] = str; + Py_DecRef(val); + } + else { + str = sym_new_type(ctx, &PyUnicode_Type); + } + stack_pointer[-1] = str; break; } @@ -2091,11 +2099,19 @@ } case _BUILD_SLICE: { + JitOptSymbol *value; JitOptSymbol *slice; - slice = sym_new_not_null(ctx); - stack_pointer[-oparg] = slice; - stack_pointer += 1 - oparg; - assert(WITHIN_STACK_BOUNDS()); + value = stack_pointer[-1]; + if (sym_is_const(ctx, value)) { + PyObject *val = sym_get_const(ctx, value); + slice = sym_new_const(ctx, val); + stack_pointer[-1] = slice; + Py_DecRef(val); + } + else { + slice = sym_new_type(ctx, &PySlice_Type); + } + stack_pointer[-1] = slice; break; } From 11ea46e78aecb4adb5de39174a1cb8e8bd1cd13e Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Wed, 16 Apr 2025 03:07:09 +0800 Subject: [PATCH 02/11] gh-131798: Add JIT path for _BUILD_STRING Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 12 ++++++------ Python/optimizer_cases.c.h | 26 ++++++++++++++++---------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 5fc89fc7e53c64..dea1a9abfe12ab 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -919,9 +919,9 @@ dummy_func(void) { tup = sym_new_tuple(ctx, oparg, values); } - op(_BUILD_SLICE, (value -- slice)) { - if (sym_is_const(ctx, value)) { - PyObject *val = sym_get_const(ctx, value); + op(_BUILD_SLICE, (values[oparg] -- slice)) { + if (sym_is_const(ctx, values[oparg])) { + PyObject *val = sym_get_const(ctx, values[oparg]); slice = sym_new_const(ctx, val); Py_DecRef(val); } @@ -929,9 +929,9 @@ dummy_func(void) { slice = sym_new_type(ctx, &PySlice_Type); } } - op(_BUILD_STRING, (value -- str)) { - if (sym_is_const(ctx, value)) { - PyObject *val = sym_get_const(ctx, value); + op(_BUILD_STRING, (values[oparg] -- str)) { + if (sym_is_const(ctx, values[oparg])) { + PyObject *val = sym_get_const(ctx, values[oparg]); str = sym_new_const(ctx, val); Py_DecRef(val); } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 6c4665de3cf696..cc152b512d7edf 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1010,17 +1010,20 @@ } case _BUILD_STRING: { - JitOptSymbol *value; + JitOptSymbol **values; JitOptSymbol *str; - value = stack_pointer[-1]; - if (sym_is_const(ctx, value)) { - PyObject *val = sym_get_const(ctx, value); + values = &stack_pointer[-oparg]; + if (sym_is_const(ctx, values[oparg])) { + PyObject *val = sym_get_const(ctx, values[oparg]); str = sym_new_const(ctx, val); - stack_pointer[-1] = str; + stack_pointer[-oparg] = str; + stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); Py_DecRef(val); } else { str = sym_new_type(ctx, &PyUnicode_Type); + stack_pointer += 1 - oparg; } stack_pointer[-1] = str; break; @@ -2099,17 +2102,20 @@ } case _BUILD_SLICE: { - JitOptSymbol *value; + JitOptSymbol **values; JitOptSymbol *slice; - value = stack_pointer[-1]; - if (sym_is_const(ctx, value)) { - PyObject *val = sym_get_const(ctx, value); + values = &stack_pointer[-oparg]; + if (sym_is_const(ctx, values[oparg])) { + PyObject *val = sym_get_const(ctx, values[oparg]); slice = sym_new_const(ctx, val); - stack_pointer[-1] = slice; + stack_pointer[-oparg] = slice; + stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); Py_DecRef(val); } else { slice = sym_new_type(ctx, &PySlice_Type); + stack_pointer += 1 - oparg; } stack_pointer[-1] = slice; break; From ab00ff4295c5dd37df0a2524256d21203362c5fa Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Wed, 16 Apr 2025 03:42:48 +0800 Subject: [PATCH 03/11] gh-131798: Add JIT path for _BUILD_STRING Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index dea1a9abfe12ab..d902c5eac83eec 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -919,16 +919,6 @@ dummy_func(void) { tup = sym_new_tuple(ctx, oparg, values); } - op(_BUILD_SLICE, (values[oparg] -- slice)) { - if (sym_is_const(ctx, values[oparg])) { - PyObject *val = sym_get_const(ctx, values[oparg]); - slice = sym_new_const(ctx, val); - Py_DecRef(val); - } - else { - slice = sym_new_type(ctx, &PySlice_Type); - } - } op(_BUILD_STRING, (values[oparg] -- str)) { if (sym_is_const(ctx, values[oparg])) { PyObject *val = sym_get_const(ctx, values[oparg]); From 445ec7de60ce9e2294b775aca7083ec4b2213c28 Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Wed, 16 Apr 2025 03:47:58 +0800 Subject: [PATCH 04/11] gh-131798: Add JIT path for _BUILD_STRING Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 11 +++++++++-- Python/optimizer_cases.c.h | 30 +++++++++++++----------------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index d902c5eac83eec..9a6268cd8a7a70 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -920,8 +920,15 @@ dummy_func(void) { } op(_BUILD_STRING, (values[oparg] -- str)) { - if (sym_is_const(ctx, values[oparg])) { - PyObject *val = sym_get_const(ctx, values[oparg]); + bool is_const = true; + for (int i = 0; i < oparg; i++) { + if (!sym_is_const(ctx, values[i])) { + is_const = false; + break; + } + } + if (is_const) { + PyObject *val = sym_get_const(ctx, values[0]); str = sym_new_const(ctx, val); Py_DecRef(val); } diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index cc152b512d7edf..1b3b8e97fdb9e8 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1013,8 +1013,15 @@ JitOptSymbol **values; JitOptSymbol *str; values = &stack_pointer[-oparg]; - if (sym_is_const(ctx, values[oparg])) { - PyObject *val = sym_get_const(ctx, values[oparg]); + bool is_const = true; + for (int i = 0; i < oparg; i++) { + if (!sym_is_const(ctx, values[i])) { + is_const = false; + break; + } + } + if (is_const) { + PyObject *val = sym_get_const(ctx, values[0]); str = sym_new_const(ctx, val); stack_pointer[-oparg] = str; stack_pointer += 1 - oparg; @@ -2102,22 +2109,11 @@ } case _BUILD_SLICE: { - JitOptSymbol **values; JitOptSymbol *slice; - values = &stack_pointer[-oparg]; - if (sym_is_const(ctx, values[oparg])) { - PyObject *val = sym_get_const(ctx, values[oparg]); - slice = sym_new_const(ctx, val); - stack_pointer[-oparg] = slice; - stack_pointer += 1 - oparg; - assert(WITHIN_STACK_BOUNDS()); - Py_DecRef(val); - } - else { - slice = sym_new_type(ctx, &PySlice_Type); - stack_pointer += 1 - oparg; - } - stack_pointer[-1] = slice; + slice = sym_new_not_null(ctx); + stack_pointer[-oparg] = slice; + stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } From 720915d9cb8ffb3565d8d46441d5afa77a4cea38 Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Sat, 26 Apr 2025 18:42:18 +0800 Subject: [PATCH 05/11] Set type for string and slice Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 26 ++++++++------------------ Python/optimizer_cases.c.h | 28 +++++----------------------- 2 files changed, 13 insertions(+), 41 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 9a6268cd8a7a70..6c16945f394375 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -915,26 +915,16 @@ dummy_func(void) { res = sym_new_const(ctx, Py_True); } - op(_BUILD_TUPLE, (values[oparg] -- tup)) { - tup = sym_new_tuple(ctx, oparg, values); + op(_BUILD_STRING, (values[oparg] -- str)) { + str = sym_new_type(ctx, &PyUnicode_Type); } - op(_BUILD_STRING, (values[oparg] -- str)) { - bool is_const = true; - for (int i = 0; i < oparg; i++) { - if (!sym_is_const(ctx, values[i])) { - is_const = false; - break; - } - } - if (is_const) { - PyObject *val = sym_get_const(ctx, values[0]); - str = sym_new_const(ctx, val); - Py_DecRef(val); - } - else { - str = sym_new_type(ctx, &PyUnicode_Type); - } + op(_BUILD_SLICE, (values[oparg] -- slice)) { + slice = sym_new_type(ctx, &PySlice_Type); + } + + op(_BUILD_TUPLE, (values[oparg] -- tup)) { + tup = sym_new_tuple(ctx, oparg, values); } op(_UNPACK_SEQUENCE_TWO_TUPLE, (seq -- val1, val0)) { diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 1b3b8e97fdb9e8..e8558a8bcb9bcf 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1010,29 +1010,11 @@ } case _BUILD_STRING: { - JitOptSymbol **values; JitOptSymbol *str; - values = &stack_pointer[-oparg]; - bool is_const = true; - for (int i = 0; i < oparg; i++) { - if (!sym_is_const(ctx, values[i])) { - is_const = false; - break; - } - } - if (is_const) { - PyObject *val = sym_get_const(ctx, values[0]); - str = sym_new_const(ctx, val); - stack_pointer[-oparg] = str; - stack_pointer += 1 - oparg; - assert(WITHIN_STACK_BOUNDS()); - Py_DecRef(val); - } - else { - str = sym_new_type(ctx, &PyUnicode_Type); - stack_pointer += 1 - oparg; - } - stack_pointer[-1] = str; + str = sym_new_type(ctx, &PyUnicode_Type); + stack_pointer[-oparg] = str; + stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2110,7 +2092,7 @@ case _BUILD_SLICE: { JitOptSymbol *slice; - slice = sym_new_not_null(ctx); + slice = sym_new_type(ctx, &PySlice_Type); stack_pointer[-oparg] = slice; stack_pointer += 1 - oparg; assert(WITHIN_STACK_BOUNDS()); From c6599c21ea8b06f49b357bc3d34fbfea62e1ea15 Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Sat, 26 Apr 2025 18:43:38 +0800 Subject: [PATCH 06/11] Update news Signed-off-by: Manjusaka --- .../2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst new file mode 100644 index 00000000000000..a82b8f7947cfbe --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst @@ -0,0 +1,2 @@ +Use ``sym_new_type`` instead of ``sym_new_not_null`` for _BUILD_STRING, +_BUILD_SLICE From 52a4d34903b83b918896f2b61dfe8c65b73e3c7e Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Sat, 26 Apr 2025 19:50:06 +0800 Subject: [PATCH 07/11] Update code Signed-off-by: Manjusaka --- .../2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst | 2 +- Python/optimizer_bytecodes.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst index a82b8f7947cfbe..a252d2b69fc020 100644 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-04-26-18-43-31.gh-issue-131798.FsIypo.rst @@ -1,2 +1,2 @@ Use ``sym_new_type`` instead of ``sym_new_not_null`` for _BUILD_STRING, -_BUILD_SLICE +_BUILD_SET diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index cef99b5a90faf8..22917cd56e39da 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -944,6 +944,10 @@ dummy_func(void) { str = sym_new_type(ctx, &PyUnicode_Type); } + op(_BUILD_SET, (values[oparg] -- set)) { + set = sym_new_type(ctx, &PySet_Type); + } + op(_BUILD_SLICE, (values[oparg] -- slice)) { slice = sym_new_type(ctx, &PySlice_Type); } @@ -956,10 +960,6 @@ dummy_func(void) { list = sym_new_type(ctx, &PyList_Type); } - op(_BUILD_SLICE, (values[oparg] -- slice)) { - slice = sym_new_type(ctx, &PySlice_Type); - } - op(_BUILD_MAP, (values[oparg*2] -- map)) { map = sym_new_type(ctx, &PyDict_Type); } From bdba96cd6c1ed5d1243be2bb1b11155bdb6cdc33 Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Sat, 26 Apr 2025 19:51:21 +0800 Subject: [PATCH 08/11] Update code Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 18 ++++++++++-------- Python/optimizer_cases.c.h | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 22917cd56e39da..0e10bdea96d3b8 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -940,12 +940,14 @@ dummy_func(void) { res = sym_new_const(ctx, Py_True); } - op(_BUILD_STRING, (values[oparg] -- str)) { - str = sym_new_type(ctx, &PyUnicode_Type); + + + op(_BUILD_LIST, (values[oparg] -- list)) { + list = sym_new_type(ctx, &PyList_Type); } - op(_BUILD_SET, (values[oparg] -- set)) { - set = sym_new_type(ctx, &PySet_Type); + op(_BUILD_MAP, (values[oparg*2] -- map)) { + map = sym_new_type(ctx, &PyDict_Type); } op(_BUILD_SLICE, (values[oparg] -- slice)) { @@ -956,12 +958,12 @@ dummy_func(void) { tup = sym_new_tuple(ctx, oparg, values); } - op(_BUILD_LIST, (values[oparg] -- list)) { - list = sym_new_type(ctx, &PyList_Type); + op(_BUILD_STRING, (values[oparg] -- str)) { + str = sym_new_type(ctx, &PyUnicode_Type); } - op(_BUILD_MAP, (values[oparg*2] -- map)) { - map = sym_new_type(ctx, &PyDict_Type); + op(_BUILD_SET, (values[oparg] -- set)) { + set = sym_new_type(ctx, &PySet_Type); } op(_UNPACK_SEQUENCE_TWO_TUPLE, (seq -- val1, val0)) { diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index ab3441cc8cfe08..d67951f76006b5 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -1053,7 +1053,7 @@ case _BUILD_SET: { JitOptSymbol *set; - set = sym_new_not_null(ctx); + set = sym_new_type(ctx, &PySet_Type); stack_pointer[-oparg] = set; stack_pointer += 1 - oparg; assert(WITHIN_STACK_BOUNDS()); From 14b575f31d95793665d226dcdbdccfa4d30fce93 Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Sat, 26 Apr 2025 19:51:59 +0800 Subject: [PATCH 09/11] Update code Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 0e10bdea96d3b8..c8ef4f35063ad8 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -940,7 +940,9 @@ dummy_func(void) { res = sym_new_const(ctx, Py_True); } - + op(_BUILD_TUPLE, (values[oparg] -- tup)) { + tup = sym_new_tuple(ctx, oparg, values); + } op(_BUILD_LIST, (values[oparg] -- list)) { list = sym_new_type(ctx, &PyList_Type); @@ -954,10 +956,6 @@ dummy_func(void) { slice = sym_new_type(ctx, &PySlice_Type); } - op(_BUILD_TUPLE, (values[oparg] -- tup)) { - tup = sym_new_tuple(ctx, oparg, values); - } - op(_BUILD_STRING, (values[oparg] -- str)) { str = sym_new_type(ctx, &PyUnicode_Type); } From 9e743747da8eb74509222395a00f4f7ad07231af Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Sat, 26 Apr 2025 19:52:27 +0800 Subject: [PATCH 10/11] Update code Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index c8ef4f35063ad8..78fa032eec1e01 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -948,14 +948,15 @@ dummy_func(void) { list = sym_new_type(ctx, &PyList_Type); } - op(_BUILD_MAP, (values[oparg*2] -- map)) { - map = sym_new_type(ctx, &PyDict_Type); - } op(_BUILD_SLICE, (values[oparg] -- slice)) { slice = sym_new_type(ctx, &PySlice_Type); } + op(_BUILD_MAP, (values[oparg*2] -- map)) { + map = sym_new_type(ctx, &PyDict_Type); + } + op(_BUILD_STRING, (values[oparg] -- str)) { str = sym_new_type(ctx, &PyUnicode_Type); } From 08578522bca2dd9ebe89f056babeb4e9d2996cf6 Mon Sep 17 00:00:00 2001 From: Manjusaka Date: Sun, 27 Apr 2025 12:08:00 +0800 Subject: [PATCH 11/11] Update code Signed-off-by: Manjusaka --- Python/optimizer_bytecodes.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c index 78fa032eec1e01..f12325c9efcc50 100644 --- a/Python/optimizer_bytecodes.c +++ b/Python/optimizer_bytecodes.c @@ -948,7 +948,6 @@ dummy_func(void) { list = sym_new_type(ctx, &PyList_Type); } - op(_BUILD_SLICE, (values[oparg] -- slice)) { slice = sym_new_type(ctx, &PySlice_Type); }