]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-134584: Eliminate redundant refcounting from `_LOAD_ATTR_INSTANCE_VALUE` (GH-142769)
authorNadeshiko Manju <me@manjusaka.me>
Tue, 16 Dec 2025 20:39:20 +0000 (05:39 +0900)
committerGitHub <noreply@github.com>
Tue, 16 Dec 2025 20:39:20 +0000 (20:39 +0000)
Signed-off-by: Manjusaka <me@manjusaka.me>
Include/internal/pycore_opcode_metadata.h
Include/internal/pycore_uop_ids.h
Include/internal/pycore_uop_metadata.h
Lib/test/test_capi/test_opt.py
Misc/NEWS.d/next/Core_and_Builtins/2025-12-16-05-52-37.gh-issue-134584.VsfOQR.rst [new file with mode: 0644]
Python/bytecodes.c
Python/executor_cases.c.h
Python/generated_cases.c.h
Python/optimizer_bytecodes.c
Python/optimizer_cases.c.h

index ce8a26c551bf175517ddbcea7d827cb2a20a91aa..c0e3725db1d7cae822d5e58f4f05fcdd5e23912c 100644 (file)
@@ -1425,7 +1425,7 @@ _PyOpcode_macro_expansion[256] = {
     [LOAD_ATTR] = { .nuops = 1, .uops = { { _LOAD_ATTR, OPARG_SIMPLE, 8 } } },
     [LOAD_ATTR_CLASS] = { .nuops = 3, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
     [LOAD_ATTR_CLASS_WITH_METACLASS_CHECK] = { .nuops = 4, .uops = { { _CHECK_ATTR_CLASS, 2, 1 }, { _GUARD_TYPE_VERSION, 2, 3 }, { _LOAD_ATTR_CLASS, 4, 5 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
-    [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, OPARG_SIMPLE, 3 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
+    [LOAD_ATTR_INSTANCE_VALUE] = { .nuops = 5, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_MANAGED_OBJECT_HAS_VALUES, OPARG_SIMPLE, 3 }, { _LOAD_ATTR_INSTANCE_VALUE, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
     [LOAD_ATTR_METHOD_LAZY_DICT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _CHECK_ATTR_METHOD_LAZY_DICT, 1, 3 }, { _LOAD_ATTR_METHOD_LAZY_DICT, 4, 5 } } },
     [LOAD_ATTR_METHOD_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_METHOD_NO_DICT, 4, 5 } } },
     [LOAD_ATTR_METHOD_WITH_VALUES] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT, OPARG_SIMPLE, 3 }, { _GUARD_KEYS_VERSION, 2, 3 }, { _LOAD_ATTR_METHOD_WITH_VALUES, 4, 5 } } },
index df623f49b0d52cf8d47b705b1dc5cab177001c6e..5519e14e9020c4dfd0b229e63bb93db280f73432 100644 (file)
@@ -788,313 +788,315 @@ extern "C" {
 #define _LOAD_ATTR_r10 981
 #define _LOAD_ATTR_CLASS_r11 982
 #define _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN_r11 983
-#define _LOAD_ATTR_INSTANCE_VALUE_r11 984
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 985
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 986
-#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 987
-#define _LOAD_ATTR_METHOD_NO_DICT_r02 988
-#define _LOAD_ATTR_METHOD_NO_DICT_r12 989
-#define _LOAD_ATTR_METHOD_NO_DICT_r23 990
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 991
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 992
-#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 993
-#define _LOAD_ATTR_MODULE_r11 994
-#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 995
-#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 996
-#define _LOAD_ATTR_PROPERTY_FRAME_r11 997
-#define _LOAD_ATTR_SLOT_r11 998
-#define _LOAD_ATTR_WITH_HINT_r11 999
-#define _LOAD_BUILD_CLASS_r01 1000
-#define _LOAD_BYTECODE_r00 1001
-#define _LOAD_COMMON_CONSTANT_r01 1002
-#define _LOAD_COMMON_CONSTANT_r12 1003
-#define _LOAD_COMMON_CONSTANT_r23 1004
-#define _LOAD_CONST_r01 1005
-#define _LOAD_CONST_r12 1006
-#define _LOAD_CONST_r23 1007
-#define _LOAD_CONST_INLINE_r01 1008
-#define _LOAD_CONST_INLINE_r12 1009
-#define _LOAD_CONST_INLINE_r23 1010
-#define _LOAD_CONST_INLINE_BORROW_r01 1011
-#define _LOAD_CONST_INLINE_BORROW_r12 1012
-#define _LOAD_CONST_INLINE_BORROW_r23 1013
-#define _LOAD_CONST_UNDER_INLINE_r02 1014
-#define _LOAD_CONST_UNDER_INLINE_r12 1015
-#define _LOAD_CONST_UNDER_INLINE_r23 1016
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1017
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1018
-#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1019
-#define _LOAD_DEREF_r01 1020
-#define _LOAD_FAST_r01 1021
-#define _LOAD_FAST_r12 1022
-#define _LOAD_FAST_r23 1023
-#define _LOAD_FAST_0_r01 1024
-#define _LOAD_FAST_0_r12 1025
-#define _LOAD_FAST_0_r23 1026
-#define _LOAD_FAST_1_r01 1027
-#define _LOAD_FAST_1_r12 1028
-#define _LOAD_FAST_1_r23 1029
-#define _LOAD_FAST_2_r01 1030
-#define _LOAD_FAST_2_r12 1031
-#define _LOAD_FAST_2_r23 1032
-#define _LOAD_FAST_3_r01 1033
-#define _LOAD_FAST_3_r12 1034
-#define _LOAD_FAST_3_r23 1035
-#define _LOAD_FAST_4_r01 1036
-#define _LOAD_FAST_4_r12 1037
-#define _LOAD_FAST_4_r23 1038
-#define _LOAD_FAST_5_r01 1039
-#define _LOAD_FAST_5_r12 1040
-#define _LOAD_FAST_5_r23 1041
-#define _LOAD_FAST_6_r01 1042
-#define _LOAD_FAST_6_r12 1043
-#define _LOAD_FAST_6_r23 1044
-#define _LOAD_FAST_7_r01 1045
-#define _LOAD_FAST_7_r12 1046
-#define _LOAD_FAST_7_r23 1047
-#define _LOAD_FAST_AND_CLEAR_r01 1048
-#define _LOAD_FAST_AND_CLEAR_r12 1049
-#define _LOAD_FAST_AND_CLEAR_r23 1050
-#define _LOAD_FAST_BORROW_r01 1051
-#define _LOAD_FAST_BORROW_r12 1052
-#define _LOAD_FAST_BORROW_r23 1053
-#define _LOAD_FAST_BORROW_0_r01 1054
-#define _LOAD_FAST_BORROW_0_r12 1055
-#define _LOAD_FAST_BORROW_0_r23 1056
-#define _LOAD_FAST_BORROW_1_r01 1057
-#define _LOAD_FAST_BORROW_1_r12 1058
-#define _LOAD_FAST_BORROW_1_r23 1059
-#define _LOAD_FAST_BORROW_2_r01 1060
-#define _LOAD_FAST_BORROW_2_r12 1061
-#define _LOAD_FAST_BORROW_2_r23 1062
-#define _LOAD_FAST_BORROW_3_r01 1063
-#define _LOAD_FAST_BORROW_3_r12 1064
-#define _LOAD_FAST_BORROW_3_r23 1065
-#define _LOAD_FAST_BORROW_4_r01 1066
-#define _LOAD_FAST_BORROW_4_r12 1067
-#define _LOAD_FAST_BORROW_4_r23 1068
-#define _LOAD_FAST_BORROW_5_r01 1069
-#define _LOAD_FAST_BORROW_5_r12 1070
-#define _LOAD_FAST_BORROW_5_r23 1071
-#define _LOAD_FAST_BORROW_6_r01 1072
-#define _LOAD_FAST_BORROW_6_r12 1073
-#define _LOAD_FAST_BORROW_6_r23 1074
-#define _LOAD_FAST_BORROW_7_r01 1075
-#define _LOAD_FAST_BORROW_7_r12 1076
-#define _LOAD_FAST_BORROW_7_r23 1077
-#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1078
-#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1079
-#define _LOAD_FAST_CHECK_r01 1080
-#define _LOAD_FAST_CHECK_r12 1081
-#define _LOAD_FAST_CHECK_r23 1082
-#define _LOAD_FAST_LOAD_FAST_r02 1083
-#define _LOAD_FAST_LOAD_FAST_r13 1084
-#define _LOAD_FROM_DICT_OR_DEREF_r11 1085
-#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1086
-#define _LOAD_GLOBAL_r00 1087
-#define _LOAD_GLOBAL_BUILTINS_r01 1088
-#define _LOAD_GLOBAL_MODULE_r01 1089
-#define _LOAD_LOCALS_r01 1090
-#define _LOAD_LOCALS_r12 1091
-#define _LOAD_LOCALS_r23 1092
-#define _LOAD_NAME_r01 1093
-#define _LOAD_SMALL_INT_r01 1094
-#define _LOAD_SMALL_INT_r12 1095
-#define _LOAD_SMALL_INT_r23 1096
-#define _LOAD_SMALL_INT_0_r01 1097
-#define _LOAD_SMALL_INT_0_r12 1098
-#define _LOAD_SMALL_INT_0_r23 1099
-#define _LOAD_SMALL_INT_1_r01 1100
-#define _LOAD_SMALL_INT_1_r12 1101
-#define _LOAD_SMALL_INT_1_r23 1102
-#define _LOAD_SMALL_INT_2_r01 1103
-#define _LOAD_SMALL_INT_2_r12 1104
-#define _LOAD_SMALL_INT_2_r23 1105
-#define _LOAD_SMALL_INT_3_r01 1106
-#define _LOAD_SMALL_INT_3_r12 1107
-#define _LOAD_SMALL_INT_3_r23 1108
-#define _LOAD_SPECIAL_r00 1109
-#define _LOAD_SUPER_ATTR_ATTR_r31 1110
-#define _LOAD_SUPER_ATTR_METHOD_r32 1111
-#define _MAKE_CALLARGS_A_TUPLE_r33 1112
-#define _MAKE_CELL_r00 1113
-#define _MAKE_FUNCTION_r11 1114
-#define _MAKE_WARM_r00 1115
-#define _MAKE_WARM_r11 1116
-#define _MAKE_WARM_r22 1117
-#define _MAKE_WARM_r33 1118
-#define _MAP_ADD_r20 1119
-#define _MATCH_CLASS_r31 1120
-#define _MATCH_KEYS_r23 1121
-#define _MATCH_MAPPING_r02 1122
-#define _MATCH_MAPPING_r12 1123
-#define _MATCH_MAPPING_r23 1124
-#define _MATCH_SEQUENCE_r02 1125
-#define _MATCH_SEQUENCE_r12 1126
-#define _MATCH_SEQUENCE_r23 1127
-#define _MAYBE_EXPAND_METHOD_r00 1128
-#define _MAYBE_EXPAND_METHOD_KW_r11 1129
-#define _MONITOR_CALL_r00 1130
-#define _MONITOR_CALL_KW_r11 1131
-#define _MONITOR_JUMP_BACKWARD_r00 1132
-#define _MONITOR_JUMP_BACKWARD_r11 1133
-#define _MONITOR_JUMP_BACKWARD_r22 1134
-#define _MONITOR_JUMP_BACKWARD_r33 1135
-#define _MONITOR_RESUME_r00 1136
-#define _NOP_r00 1137
-#define _NOP_r11 1138
-#define _NOP_r22 1139
-#define _NOP_r33 1140
-#define _POP_CALL_r20 1141
-#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1142
-#define _POP_CALL_ONE_r30 1143
-#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1144
-#define _POP_CALL_TWO_r30 1145
-#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1146
-#define _POP_EXCEPT_r10 1147
-#define _POP_ITER_r20 1148
-#define _POP_JUMP_IF_FALSE_r00 1149
-#define _POP_JUMP_IF_FALSE_r10 1150
-#define _POP_JUMP_IF_FALSE_r21 1151
-#define _POP_JUMP_IF_FALSE_r32 1152
-#define _POP_JUMP_IF_TRUE_r00 1153
-#define _POP_JUMP_IF_TRUE_r10 1154
-#define _POP_JUMP_IF_TRUE_r21 1155
-#define _POP_JUMP_IF_TRUE_r32 1156
-#define _POP_TOP_r10 1157
-#define _POP_TOP_FLOAT_r00 1158
-#define _POP_TOP_FLOAT_r10 1159
-#define _POP_TOP_FLOAT_r21 1160
-#define _POP_TOP_FLOAT_r32 1161
-#define _POP_TOP_INT_r00 1162
-#define _POP_TOP_INT_r10 1163
-#define _POP_TOP_INT_r21 1164
-#define _POP_TOP_INT_r32 1165
-#define _POP_TOP_LOAD_CONST_INLINE_r11 1166
-#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1167
-#define _POP_TOP_NOP_r00 1168
-#define _POP_TOP_NOP_r10 1169
-#define _POP_TOP_NOP_r21 1170
-#define _POP_TOP_NOP_r32 1171
-#define _POP_TOP_UNICODE_r00 1172
-#define _POP_TOP_UNICODE_r10 1173
-#define _POP_TOP_UNICODE_r21 1174
-#define _POP_TOP_UNICODE_r32 1175
-#define _POP_TWO_r20 1176
-#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1177
-#define _PUSH_EXC_INFO_r02 1178
-#define _PUSH_EXC_INFO_r12 1179
-#define _PUSH_EXC_INFO_r23 1180
-#define _PUSH_FRAME_r10 1181
-#define _PUSH_NULL_r01 1182
-#define _PUSH_NULL_r12 1183
-#define _PUSH_NULL_r23 1184
-#define _PUSH_NULL_CONDITIONAL_r00 1185
-#define _PY_FRAME_GENERAL_r01 1186
-#define _PY_FRAME_KW_r11 1187
-#define _QUICKEN_RESUME_r00 1188
-#define _QUICKEN_RESUME_r11 1189
-#define _QUICKEN_RESUME_r22 1190
-#define _QUICKEN_RESUME_r33 1191
-#define _REPLACE_WITH_TRUE_r11 1192
-#define _RESUME_CHECK_r00 1193
-#define _RESUME_CHECK_r11 1194
-#define _RESUME_CHECK_r22 1195
-#define _RESUME_CHECK_r33 1196
-#define _RETURN_GENERATOR_r01 1197
-#define _RETURN_VALUE_r11 1198
-#define _SAVE_RETURN_OFFSET_r00 1199
-#define _SAVE_RETURN_OFFSET_r11 1200
-#define _SAVE_RETURN_OFFSET_r22 1201
-#define _SAVE_RETURN_OFFSET_r33 1202
-#define _SEND_r22 1203
-#define _SEND_GEN_FRAME_r22 1204
-#define _SETUP_ANNOTATIONS_r00 1205
-#define _SET_ADD_r10 1206
-#define _SET_FUNCTION_ATTRIBUTE_r01 1207
-#define _SET_FUNCTION_ATTRIBUTE_r11 1208
-#define _SET_FUNCTION_ATTRIBUTE_r21 1209
-#define _SET_FUNCTION_ATTRIBUTE_r32 1210
-#define _SET_IP_r00 1211
-#define _SET_IP_r11 1212
-#define _SET_IP_r22 1213
-#define _SET_IP_r33 1214
-#define _SET_UPDATE_r10 1215
-#define _SPILL_OR_RELOAD_r01 1216
-#define _SPILL_OR_RELOAD_r02 1217
-#define _SPILL_OR_RELOAD_r03 1218
-#define _SPILL_OR_RELOAD_r10 1219
-#define _SPILL_OR_RELOAD_r12 1220
-#define _SPILL_OR_RELOAD_r13 1221
-#define _SPILL_OR_RELOAD_r20 1222
-#define _SPILL_OR_RELOAD_r21 1223
-#define _SPILL_OR_RELOAD_r23 1224
-#define _SPILL_OR_RELOAD_r30 1225
-#define _SPILL_OR_RELOAD_r31 1226
-#define _SPILL_OR_RELOAD_r32 1227
-#define _START_EXECUTOR_r00 1228
-#define _STORE_ATTR_r20 1229
-#define _STORE_ATTR_INSTANCE_VALUE_r21 1230
-#define _STORE_ATTR_SLOT_r21 1231
-#define _STORE_ATTR_WITH_HINT_r20 1232
-#define _STORE_DEREF_r10 1233
-#define _STORE_FAST_r10 1234
-#define _STORE_FAST_0_r10 1235
-#define _STORE_FAST_1_r10 1236
-#define _STORE_FAST_2_r10 1237
-#define _STORE_FAST_3_r10 1238
-#define _STORE_FAST_4_r10 1239
-#define _STORE_FAST_5_r10 1240
-#define _STORE_FAST_6_r10 1241
-#define _STORE_FAST_7_r10 1242
-#define _STORE_FAST_LOAD_FAST_r11 1243
-#define _STORE_FAST_STORE_FAST_r20 1244
-#define _STORE_GLOBAL_r10 1245
-#define _STORE_NAME_r10 1246
-#define _STORE_SLICE_r30 1247
-#define _STORE_SUBSCR_r30 1248
-#define _STORE_SUBSCR_DICT_r31 1249
-#define _STORE_SUBSCR_LIST_INT_r32 1250
-#define _SWAP_r11 1251
-#define _SWAP_2_r02 1252
-#define _SWAP_2_r12 1253
-#define _SWAP_2_r22 1254
-#define _SWAP_2_r33 1255
-#define _SWAP_3_r03 1256
-#define _SWAP_3_r13 1257
-#define _SWAP_3_r23 1258
-#define _SWAP_3_r33 1259
-#define _TIER2_RESUME_CHECK_r00 1260
-#define _TIER2_RESUME_CHECK_r11 1261
-#define _TIER2_RESUME_CHECK_r22 1262
-#define _TIER2_RESUME_CHECK_r33 1263
-#define _TO_BOOL_r11 1264
-#define _TO_BOOL_BOOL_r01 1265
-#define _TO_BOOL_BOOL_r11 1266
-#define _TO_BOOL_BOOL_r22 1267
-#define _TO_BOOL_BOOL_r33 1268
-#define _TO_BOOL_INT_r11 1269
-#define _TO_BOOL_LIST_r11 1270
-#define _TO_BOOL_NONE_r01 1271
-#define _TO_BOOL_NONE_r11 1272
-#define _TO_BOOL_NONE_r22 1273
-#define _TO_BOOL_NONE_r33 1274
-#define _TO_BOOL_STR_r11 1275
-#define _TRACE_RECORD_r00 1276
-#define _UNARY_INVERT_r11 1277
-#define _UNARY_NEGATIVE_r11 1278
-#define _UNARY_NOT_r01 1279
-#define _UNARY_NOT_r11 1280
-#define _UNARY_NOT_r22 1281
-#define _UNARY_NOT_r33 1282
-#define _UNPACK_EX_r10 1283
-#define _UNPACK_SEQUENCE_r10 1284
-#define _UNPACK_SEQUENCE_LIST_r10 1285
-#define _UNPACK_SEQUENCE_TUPLE_r10 1286
-#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1287
-#define _WITH_EXCEPT_START_r33 1288
-#define _YIELD_VALUE_r11 1289
-#define MAX_UOP_REGS_ID 1289
+#define _LOAD_ATTR_INSTANCE_VALUE_r02 984
+#define _LOAD_ATTR_INSTANCE_VALUE_r12 985
+#define _LOAD_ATTR_INSTANCE_VALUE_r23 986
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r02 987
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r12 988
+#define _LOAD_ATTR_METHOD_LAZY_DICT_r23 989
+#define _LOAD_ATTR_METHOD_NO_DICT_r02 990
+#define _LOAD_ATTR_METHOD_NO_DICT_r12 991
+#define _LOAD_ATTR_METHOD_NO_DICT_r23 992
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r02 993
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r12 994
+#define _LOAD_ATTR_METHOD_WITH_VALUES_r23 995
+#define _LOAD_ATTR_MODULE_r11 996
+#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 997
+#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 998
+#define _LOAD_ATTR_PROPERTY_FRAME_r11 999
+#define _LOAD_ATTR_SLOT_r11 1000
+#define _LOAD_ATTR_WITH_HINT_r11 1001
+#define _LOAD_BUILD_CLASS_r01 1002
+#define _LOAD_BYTECODE_r00 1003
+#define _LOAD_COMMON_CONSTANT_r01 1004
+#define _LOAD_COMMON_CONSTANT_r12 1005
+#define _LOAD_COMMON_CONSTANT_r23 1006
+#define _LOAD_CONST_r01 1007
+#define _LOAD_CONST_r12 1008
+#define _LOAD_CONST_r23 1009
+#define _LOAD_CONST_INLINE_r01 1010
+#define _LOAD_CONST_INLINE_r12 1011
+#define _LOAD_CONST_INLINE_r23 1012
+#define _LOAD_CONST_INLINE_BORROW_r01 1013
+#define _LOAD_CONST_INLINE_BORROW_r12 1014
+#define _LOAD_CONST_INLINE_BORROW_r23 1015
+#define _LOAD_CONST_UNDER_INLINE_r02 1016
+#define _LOAD_CONST_UNDER_INLINE_r12 1017
+#define _LOAD_CONST_UNDER_INLINE_r23 1018
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1019
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1020
+#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1021
+#define _LOAD_DEREF_r01 1022
+#define _LOAD_FAST_r01 1023
+#define _LOAD_FAST_r12 1024
+#define _LOAD_FAST_r23 1025
+#define _LOAD_FAST_0_r01 1026
+#define _LOAD_FAST_0_r12 1027
+#define _LOAD_FAST_0_r23 1028
+#define _LOAD_FAST_1_r01 1029
+#define _LOAD_FAST_1_r12 1030
+#define _LOAD_FAST_1_r23 1031
+#define _LOAD_FAST_2_r01 1032
+#define _LOAD_FAST_2_r12 1033
+#define _LOAD_FAST_2_r23 1034
+#define _LOAD_FAST_3_r01 1035
+#define _LOAD_FAST_3_r12 1036
+#define _LOAD_FAST_3_r23 1037
+#define _LOAD_FAST_4_r01 1038
+#define _LOAD_FAST_4_r12 1039
+#define _LOAD_FAST_4_r23 1040
+#define _LOAD_FAST_5_r01 1041
+#define _LOAD_FAST_5_r12 1042
+#define _LOAD_FAST_5_r23 1043
+#define _LOAD_FAST_6_r01 1044
+#define _LOAD_FAST_6_r12 1045
+#define _LOAD_FAST_6_r23 1046
+#define _LOAD_FAST_7_r01 1047
+#define _LOAD_FAST_7_r12 1048
+#define _LOAD_FAST_7_r23 1049
+#define _LOAD_FAST_AND_CLEAR_r01 1050
+#define _LOAD_FAST_AND_CLEAR_r12 1051
+#define _LOAD_FAST_AND_CLEAR_r23 1052
+#define _LOAD_FAST_BORROW_r01 1053
+#define _LOAD_FAST_BORROW_r12 1054
+#define _LOAD_FAST_BORROW_r23 1055
+#define _LOAD_FAST_BORROW_0_r01 1056
+#define _LOAD_FAST_BORROW_0_r12 1057
+#define _LOAD_FAST_BORROW_0_r23 1058
+#define _LOAD_FAST_BORROW_1_r01 1059
+#define _LOAD_FAST_BORROW_1_r12 1060
+#define _LOAD_FAST_BORROW_1_r23 1061
+#define _LOAD_FAST_BORROW_2_r01 1062
+#define _LOAD_FAST_BORROW_2_r12 1063
+#define _LOAD_FAST_BORROW_2_r23 1064
+#define _LOAD_FAST_BORROW_3_r01 1065
+#define _LOAD_FAST_BORROW_3_r12 1066
+#define _LOAD_FAST_BORROW_3_r23 1067
+#define _LOAD_FAST_BORROW_4_r01 1068
+#define _LOAD_FAST_BORROW_4_r12 1069
+#define _LOAD_FAST_BORROW_4_r23 1070
+#define _LOAD_FAST_BORROW_5_r01 1071
+#define _LOAD_FAST_BORROW_5_r12 1072
+#define _LOAD_FAST_BORROW_5_r23 1073
+#define _LOAD_FAST_BORROW_6_r01 1074
+#define _LOAD_FAST_BORROW_6_r12 1075
+#define _LOAD_FAST_BORROW_6_r23 1076
+#define _LOAD_FAST_BORROW_7_r01 1077
+#define _LOAD_FAST_BORROW_7_r12 1078
+#define _LOAD_FAST_BORROW_7_r23 1079
+#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1080
+#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1081
+#define _LOAD_FAST_CHECK_r01 1082
+#define _LOAD_FAST_CHECK_r12 1083
+#define _LOAD_FAST_CHECK_r23 1084
+#define _LOAD_FAST_LOAD_FAST_r02 1085
+#define _LOAD_FAST_LOAD_FAST_r13 1086
+#define _LOAD_FROM_DICT_OR_DEREF_r11 1087
+#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1088
+#define _LOAD_GLOBAL_r00 1089
+#define _LOAD_GLOBAL_BUILTINS_r01 1090
+#define _LOAD_GLOBAL_MODULE_r01 1091
+#define _LOAD_LOCALS_r01 1092
+#define _LOAD_LOCALS_r12 1093
+#define _LOAD_LOCALS_r23 1094
+#define _LOAD_NAME_r01 1095
+#define _LOAD_SMALL_INT_r01 1096
+#define _LOAD_SMALL_INT_r12 1097
+#define _LOAD_SMALL_INT_r23 1098
+#define _LOAD_SMALL_INT_0_r01 1099
+#define _LOAD_SMALL_INT_0_r12 1100
+#define _LOAD_SMALL_INT_0_r23 1101
+#define _LOAD_SMALL_INT_1_r01 1102
+#define _LOAD_SMALL_INT_1_r12 1103
+#define _LOAD_SMALL_INT_1_r23 1104
+#define _LOAD_SMALL_INT_2_r01 1105
+#define _LOAD_SMALL_INT_2_r12 1106
+#define _LOAD_SMALL_INT_2_r23 1107
+#define _LOAD_SMALL_INT_3_r01 1108
+#define _LOAD_SMALL_INT_3_r12 1109
+#define _LOAD_SMALL_INT_3_r23 1110
+#define _LOAD_SPECIAL_r00 1111
+#define _LOAD_SUPER_ATTR_ATTR_r31 1112
+#define _LOAD_SUPER_ATTR_METHOD_r32 1113
+#define _MAKE_CALLARGS_A_TUPLE_r33 1114
+#define _MAKE_CELL_r00 1115
+#define _MAKE_FUNCTION_r11 1116
+#define _MAKE_WARM_r00 1117
+#define _MAKE_WARM_r11 1118
+#define _MAKE_WARM_r22 1119
+#define _MAKE_WARM_r33 1120
+#define _MAP_ADD_r20 1121
+#define _MATCH_CLASS_r31 1122
+#define _MATCH_KEYS_r23 1123
+#define _MATCH_MAPPING_r02 1124
+#define _MATCH_MAPPING_r12 1125
+#define _MATCH_MAPPING_r23 1126
+#define _MATCH_SEQUENCE_r02 1127
+#define _MATCH_SEQUENCE_r12 1128
+#define _MATCH_SEQUENCE_r23 1129
+#define _MAYBE_EXPAND_METHOD_r00 1130
+#define _MAYBE_EXPAND_METHOD_KW_r11 1131
+#define _MONITOR_CALL_r00 1132
+#define _MONITOR_CALL_KW_r11 1133
+#define _MONITOR_JUMP_BACKWARD_r00 1134
+#define _MONITOR_JUMP_BACKWARD_r11 1135
+#define _MONITOR_JUMP_BACKWARD_r22 1136
+#define _MONITOR_JUMP_BACKWARD_r33 1137
+#define _MONITOR_RESUME_r00 1138
+#define _NOP_r00 1139
+#define _NOP_r11 1140
+#define _NOP_r22 1141
+#define _NOP_r33 1142
+#define _POP_CALL_r20 1143
+#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1144
+#define _POP_CALL_ONE_r30 1145
+#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1146
+#define _POP_CALL_TWO_r30 1147
+#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1148
+#define _POP_EXCEPT_r10 1149
+#define _POP_ITER_r20 1150
+#define _POP_JUMP_IF_FALSE_r00 1151
+#define _POP_JUMP_IF_FALSE_r10 1152
+#define _POP_JUMP_IF_FALSE_r21 1153
+#define _POP_JUMP_IF_FALSE_r32 1154
+#define _POP_JUMP_IF_TRUE_r00 1155
+#define _POP_JUMP_IF_TRUE_r10 1156
+#define _POP_JUMP_IF_TRUE_r21 1157
+#define _POP_JUMP_IF_TRUE_r32 1158
+#define _POP_TOP_r10 1159
+#define _POP_TOP_FLOAT_r00 1160
+#define _POP_TOP_FLOAT_r10 1161
+#define _POP_TOP_FLOAT_r21 1162
+#define _POP_TOP_FLOAT_r32 1163
+#define _POP_TOP_INT_r00 1164
+#define _POP_TOP_INT_r10 1165
+#define _POP_TOP_INT_r21 1166
+#define _POP_TOP_INT_r32 1167
+#define _POP_TOP_LOAD_CONST_INLINE_r11 1168
+#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1169
+#define _POP_TOP_NOP_r00 1170
+#define _POP_TOP_NOP_r10 1171
+#define _POP_TOP_NOP_r21 1172
+#define _POP_TOP_NOP_r32 1173
+#define _POP_TOP_UNICODE_r00 1174
+#define _POP_TOP_UNICODE_r10 1175
+#define _POP_TOP_UNICODE_r21 1176
+#define _POP_TOP_UNICODE_r32 1177
+#define _POP_TWO_r20 1178
+#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1179
+#define _PUSH_EXC_INFO_r02 1180
+#define _PUSH_EXC_INFO_r12 1181
+#define _PUSH_EXC_INFO_r23 1182
+#define _PUSH_FRAME_r10 1183
+#define _PUSH_NULL_r01 1184
+#define _PUSH_NULL_r12 1185
+#define _PUSH_NULL_r23 1186
+#define _PUSH_NULL_CONDITIONAL_r00 1187
+#define _PY_FRAME_GENERAL_r01 1188
+#define _PY_FRAME_KW_r11 1189
+#define _QUICKEN_RESUME_r00 1190
+#define _QUICKEN_RESUME_r11 1191
+#define _QUICKEN_RESUME_r22 1192
+#define _QUICKEN_RESUME_r33 1193
+#define _REPLACE_WITH_TRUE_r11 1194
+#define _RESUME_CHECK_r00 1195
+#define _RESUME_CHECK_r11 1196
+#define _RESUME_CHECK_r22 1197
+#define _RESUME_CHECK_r33 1198
+#define _RETURN_GENERATOR_r01 1199
+#define _RETURN_VALUE_r11 1200
+#define _SAVE_RETURN_OFFSET_r00 1201
+#define _SAVE_RETURN_OFFSET_r11 1202
+#define _SAVE_RETURN_OFFSET_r22 1203
+#define _SAVE_RETURN_OFFSET_r33 1204
+#define _SEND_r22 1205
+#define _SEND_GEN_FRAME_r22 1206
+#define _SETUP_ANNOTATIONS_r00 1207
+#define _SET_ADD_r10 1208
+#define _SET_FUNCTION_ATTRIBUTE_r01 1209
+#define _SET_FUNCTION_ATTRIBUTE_r11 1210
+#define _SET_FUNCTION_ATTRIBUTE_r21 1211
+#define _SET_FUNCTION_ATTRIBUTE_r32 1212
+#define _SET_IP_r00 1213
+#define _SET_IP_r11 1214
+#define _SET_IP_r22 1215
+#define _SET_IP_r33 1216
+#define _SET_UPDATE_r10 1217
+#define _SPILL_OR_RELOAD_r01 1218
+#define _SPILL_OR_RELOAD_r02 1219
+#define _SPILL_OR_RELOAD_r03 1220
+#define _SPILL_OR_RELOAD_r10 1221
+#define _SPILL_OR_RELOAD_r12 1222
+#define _SPILL_OR_RELOAD_r13 1223
+#define _SPILL_OR_RELOAD_r20 1224
+#define _SPILL_OR_RELOAD_r21 1225
+#define _SPILL_OR_RELOAD_r23 1226
+#define _SPILL_OR_RELOAD_r30 1227
+#define _SPILL_OR_RELOAD_r31 1228
+#define _SPILL_OR_RELOAD_r32 1229
+#define _START_EXECUTOR_r00 1230
+#define _STORE_ATTR_r20 1231
+#define _STORE_ATTR_INSTANCE_VALUE_r21 1232
+#define _STORE_ATTR_SLOT_r21 1233
+#define _STORE_ATTR_WITH_HINT_r20 1234
+#define _STORE_DEREF_r10 1235
+#define _STORE_FAST_r10 1236
+#define _STORE_FAST_0_r10 1237
+#define _STORE_FAST_1_r10 1238
+#define _STORE_FAST_2_r10 1239
+#define _STORE_FAST_3_r10 1240
+#define _STORE_FAST_4_r10 1241
+#define _STORE_FAST_5_r10 1242
+#define _STORE_FAST_6_r10 1243
+#define _STORE_FAST_7_r10 1244
+#define _STORE_FAST_LOAD_FAST_r11 1245
+#define _STORE_FAST_STORE_FAST_r20 1246
+#define _STORE_GLOBAL_r10 1247
+#define _STORE_NAME_r10 1248
+#define _STORE_SLICE_r30 1249
+#define _STORE_SUBSCR_r30 1250
+#define _STORE_SUBSCR_DICT_r31 1251
+#define _STORE_SUBSCR_LIST_INT_r32 1252
+#define _SWAP_r11 1253
+#define _SWAP_2_r02 1254
+#define _SWAP_2_r12 1255
+#define _SWAP_2_r22 1256
+#define _SWAP_2_r33 1257
+#define _SWAP_3_r03 1258
+#define _SWAP_3_r13 1259
+#define _SWAP_3_r23 1260
+#define _SWAP_3_r33 1261
+#define _TIER2_RESUME_CHECK_r00 1262
+#define _TIER2_RESUME_CHECK_r11 1263
+#define _TIER2_RESUME_CHECK_r22 1264
+#define _TIER2_RESUME_CHECK_r33 1265
+#define _TO_BOOL_r11 1266
+#define _TO_BOOL_BOOL_r01 1267
+#define _TO_BOOL_BOOL_r11 1268
+#define _TO_BOOL_BOOL_r22 1269
+#define _TO_BOOL_BOOL_r33 1270
+#define _TO_BOOL_INT_r11 1271
+#define _TO_BOOL_LIST_r11 1272
+#define _TO_BOOL_NONE_r01 1273
+#define _TO_BOOL_NONE_r11 1274
+#define _TO_BOOL_NONE_r22 1275
+#define _TO_BOOL_NONE_r33 1276
+#define _TO_BOOL_STR_r11 1277
+#define _TRACE_RECORD_r00 1278
+#define _UNARY_INVERT_r11 1279
+#define _UNARY_NEGATIVE_r11 1280
+#define _UNARY_NOT_r01 1281
+#define _UNARY_NOT_r11 1282
+#define _UNARY_NOT_r22 1283
+#define _UNARY_NOT_r33 1284
+#define _UNPACK_EX_r10 1285
+#define _UNPACK_SEQUENCE_r10 1286
+#define _UNPACK_SEQUENCE_LIST_r10 1287
+#define _UNPACK_SEQUENCE_TUPLE_r10 1288
+#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1289
+#define _WITH_EXCEPT_START_r33 1290
+#define _YIELD_VALUE_r11 1291
+#define MAX_UOP_REGS_ID 1291
 
 #ifdef __cplusplus
 }
index f600468c321642527f496bcde5b353b2f922cc46..f0af30df0634e839c8a698d05df207039512d7d9 100644 (file)
@@ -189,7 +189,7 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = {
     [_GUARD_TYPE_VERSION] = HAS_EXIT_FLAG,
     [_GUARD_TYPE_VERSION_AND_LOCK] = HAS_EXIT_FLAG,
     [_CHECK_MANAGED_OBJECT_HAS_VALUES] = HAS_DEOPT_FLAG,
-    [_LOAD_ATTR_INSTANCE_VALUE] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
+    [_LOAD_ATTR_INSTANCE_VALUE] = HAS_DEOPT_FLAG,
     [_LOAD_ATTR_MODULE] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
     [_LOAD_ATTR_WITH_HINT] = HAS_ARG_FLAG | HAS_NAME_FLAG | HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
     [_LOAD_ATTR_SLOT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
@@ -1752,11 +1752,11 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
         },
     },
     [_LOAD_ATTR_INSTANCE_VALUE] = {
-        .best = { 1, 1, 1, 1 },
+        .best = { 0, 1, 2, 2 },
         .entries = {
-            { -1, -1, -1 },
-            { 1, 1, _LOAD_ATTR_INSTANCE_VALUE_r11 },
-            { -1, -1, -1 },
+            { 2, 0, _LOAD_ATTR_INSTANCE_VALUE_r02 },
+            { 2, 1, _LOAD_ATTR_INSTANCE_VALUE_r12 },
+            { 3, 2, _LOAD_ATTR_INSTANCE_VALUE_r23 },
             { -1, -1, -1 },
         },
     },
@@ -3529,7 +3529,9 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {
     [_CHECK_MANAGED_OBJECT_HAS_VALUES_r11] = _CHECK_MANAGED_OBJECT_HAS_VALUES,
     [_CHECK_MANAGED_OBJECT_HAS_VALUES_r22] = _CHECK_MANAGED_OBJECT_HAS_VALUES,
     [_CHECK_MANAGED_OBJECT_HAS_VALUES_r33] = _CHECK_MANAGED_OBJECT_HAS_VALUES,
-    [_LOAD_ATTR_INSTANCE_VALUE_r11] = _LOAD_ATTR_INSTANCE_VALUE,
+    [_LOAD_ATTR_INSTANCE_VALUE_r02] = _LOAD_ATTR_INSTANCE_VALUE,
+    [_LOAD_ATTR_INSTANCE_VALUE_r12] = _LOAD_ATTR_INSTANCE_VALUE,
+    [_LOAD_ATTR_INSTANCE_VALUE_r23] = _LOAD_ATTR_INSTANCE_VALUE,
     [_LOAD_ATTR_MODULE_r11] = _LOAD_ATTR_MODULE,
     [_LOAD_ATTR_WITH_HINT_r11] = _LOAD_ATTR_WITH_HINT,
     [_LOAD_ATTR_SLOT_r11] = _LOAD_ATTR_SLOT,
@@ -4457,7 +4459,9 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
     [_LOAD_ATTR_CLASS] = "_LOAD_ATTR_CLASS",
     [_LOAD_ATTR_CLASS_r11] = "_LOAD_ATTR_CLASS_r11",
     [_LOAD_ATTR_INSTANCE_VALUE] = "_LOAD_ATTR_INSTANCE_VALUE",
-    [_LOAD_ATTR_INSTANCE_VALUE_r11] = "_LOAD_ATTR_INSTANCE_VALUE_r11",
+    [_LOAD_ATTR_INSTANCE_VALUE_r02] = "_LOAD_ATTR_INSTANCE_VALUE_r02",
+    [_LOAD_ATTR_INSTANCE_VALUE_r12] = "_LOAD_ATTR_INSTANCE_VALUE_r12",
+    [_LOAD_ATTR_INSTANCE_VALUE_r23] = "_LOAD_ATTR_INSTANCE_VALUE_r23",
     [_LOAD_ATTR_METHOD_LAZY_DICT] = "_LOAD_ATTR_METHOD_LAZY_DICT",
     [_LOAD_ATTR_METHOD_LAZY_DICT_r02] = "_LOAD_ATTR_METHOD_LAZY_DICT_r02",
     [_LOAD_ATTR_METHOD_LAZY_DICT_r12] = "_LOAD_ATTR_METHOD_LAZY_DICT_r12",
index 0fa74b9e8fae27e5df6b5c572ec62eacf90d85ba..3ae87fead94d3b6e87c965a75a976b49418a31be 100644 (file)
@@ -2473,6 +2473,25 @@ class TestUopsOptimization(unittest.TestCase):
         uops = get_opnames(ex)
         self.assertIn("_POP_TOP_NOP", uops)
 
+    def test_load_attr_instance_value(self):
+        def testfunc(n):
+            class C():
+                pass
+            c = C()
+            c.x = n
+            x = 0
+            for _ in range(n):
+                x = c.x
+            return x
+        res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD)
+        self.assertEqual(res, TIER2_THRESHOLD)
+        self.assertIsNotNone(ex)
+        uops = get_opnames(ex)
+
+        self.assertIn("_LOAD_ATTR_INSTANCE_VALUE", uops)
+        self.assertNotIn("_POP_TOP", uops)
+        self.assertIn("_POP_TOP_NOP", uops)
+
     def test_int_add_op_refcount_elimination(self):
         def testfunc(n):
             c = 1
diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-16-05-52-37.gh-issue-134584.VsfOQR.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-16-05-52-37.gh-issue-134584.VsfOQR.rst
new file mode 100644 (file)
index 0000000..d92f2c1
--- /dev/null
@@ -0,0 +1 @@
+Eliminate redundant refcounting from ``_LOAD_ATTR_INSTANCE_VALUE``.
index 391fa8ea2a94eca945de3f85fa67bb5a7ad1a330..f126c44749254b29a2700ae4537168fb7ea8b3ae 100644 (file)
@@ -2356,7 +2356,7 @@ dummy_func(
             DEOPT_IF(!FT_ATOMIC_LOAD_UINT8(_PyObject_InlineValues(owner_o)->valid));
         }
 
-        op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr)) {
+        op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr, o)) {
             PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
             PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
             PyObject *attr_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(*value_ptr);
@@ -2370,7 +2370,8 @@ dummy_func(
             attr = PyStackRef_FromPyObjectNew(attr_o);
             #endif
             STAT_INC(LOAD_ATTR, hit);
-            PyStackRef_CLOSE(owner);
+            o = owner;
+            DEAD(owner);
         }
 
         macro(LOAD_ATTR_INSTANCE_VALUE) =
@@ -2378,6 +2379,7 @@ dummy_func(
             _GUARD_TYPE_VERSION +
             _CHECK_MANAGED_OBJECT_HAS_VALUES +
             _LOAD_ATTR_INSTANCE_VALUE +
+            POP_TOP +
             unused/5 +
             _PUSH_NULL_CONDITIONAL;
 
index b2ce7d0d182215afca5a53093cbeee04b4295688..e64934483a2841fad84ff44154cd2429f58dcb2f 100644 (file)
             break;
         }
 
-        case _LOAD_ATTR_INSTANCE_VALUE_r11: {
+        case _LOAD_ATTR_INSTANCE_VALUE_r02: {
+            CHECK_CURRENT_CACHED_VALUES(0);
+            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
+            _PyStackRef owner;
+            _PyStackRef attr;
+            _PyStackRef o;
+            owner = stack_pointer[-1];
+            uint16_t offset = (uint16_t)CURRENT_OPERAND0_16();
+            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
+            PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
+            PyObject *attr_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(*value_ptr);
+            if (attr_o == NULL) {
+                UOP_STAT_INC(uopcode, miss);
+                SET_CURRENT_CACHED_VALUES(0);
+                JUMP_TO_JUMP_TARGET();
+            }
+            #ifdef Py_GIL_DISABLED
+            int increfed = _Py_TryIncrefCompareStackRef(value_ptr, attr_o, &attr);
+            if (!increfed) {
+                if (true) {
+                    UOP_STAT_INC(uopcode, miss);
+                    SET_CURRENT_CACHED_VALUES(0);
+                    JUMP_TO_JUMP_TARGET();
+                }
+            }
+            #else
+            attr = PyStackRef_FromPyObjectNew(attr_o);
+            #endif
+            STAT_INC(LOAD_ATTR, hit);
+            o = owner;
+            _tos_cache1 = o;
+            _tos_cache0 = attr;
+            SET_CURRENT_CACHED_VALUES(2);
+            stack_pointer += -1;
+            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
+            break;
+        }
+
+        case _LOAD_ATTR_INSTANCE_VALUE_r12: {
             CHECK_CURRENT_CACHED_VALUES(1);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             _PyStackRef owner;
             _PyStackRef attr;
+            _PyStackRef o;
             _PyStackRef _stack_item_0 = _tos_cache0;
             owner = _stack_item_0;
             uint16_t offset = (uint16_t)CURRENT_OPERAND0_16();
             attr = PyStackRef_FromPyObjectNew(attr_o);
             #endif
             STAT_INC(LOAD_ATTR, hit);
-            stack_pointer[0] = attr;
-            stack_pointer += 1;
-            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
-            _PyFrame_SetStackPointer(frame, stack_pointer);
-            PyStackRef_CLOSE(owner);
-            stack_pointer = _PyFrame_GetStackPointer(frame);
+            o = owner;
+            _tos_cache1 = o;
             _tos_cache0 = attr;
-            _tos_cache1 = PyStackRef_ZERO_BITS;
-            _tos_cache2 = PyStackRef_ZERO_BITS;
-            SET_CURRENT_CACHED_VALUES(1);
-            stack_pointer += -1;
-            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
+            SET_CURRENT_CACHED_VALUES(2);
+            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
+            break;
+        }
+
+        case _LOAD_ATTR_INSTANCE_VALUE_r23: {
+            CHECK_CURRENT_CACHED_VALUES(2);
+            assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
+            _PyStackRef owner;
+            _PyStackRef attr;
+            _PyStackRef o;
+            _PyStackRef _stack_item_0 = _tos_cache0;
+            _PyStackRef _stack_item_1 = _tos_cache1;
+            owner = _stack_item_1;
+            uint16_t offset = (uint16_t)CURRENT_OPERAND0_16();
+            PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
+            PyObject **value_ptr = (PyObject**)(((char *)owner_o) + offset);
+            PyObject *attr_o = FT_ATOMIC_LOAD_PTR_ACQUIRE(*value_ptr);
+            if (attr_o == NULL) {
+                UOP_STAT_INC(uopcode, miss);
+                _tos_cache1 = owner;
+                _tos_cache0 = _stack_item_0;
+                SET_CURRENT_CACHED_VALUES(2);
+                JUMP_TO_JUMP_TARGET();
+            }
+            #ifdef Py_GIL_DISABLED
+            int increfed = _Py_TryIncrefCompareStackRef(value_ptr, attr_o, &attr);
+            if (!increfed) {
+                if (true) {
+                    UOP_STAT_INC(uopcode, miss);
+                    _tos_cache1 = owner;
+                    _tos_cache0 = _stack_item_0;
+                    SET_CURRENT_CACHED_VALUES(2);
+                    JUMP_TO_JUMP_TARGET();
+                }
+            }
+            #else
+            attr = PyStackRef_FromPyObjectNew(attr_o);
+            #endif
+            STAT_INC(LOAD_ATTR, hit);
+            o = owner;
+            _tos_cache2 = o;
+            _tos_cache1 = attr;
+            _tos_cache0 = _stack_item_0;
+            SET_CURRENT_CACHED_VALUES(3);
             assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
             break;
         }
index 94846d718308a5da407f28b3d2d1ab9cb3a078d3..cd52a20be9fd119a2f12b039340b0a4e72db9274 100644 (file)
             static_assert(INLINE_CACHE_ENTRIES_LOAD_ATTR == 9, "incorrect cache size");
             _PyStackRef owner;
             _PyStackRef attr;
+            _PyStackRef o;
+            _PyStackRef value;
             _PyStackRef *null;
             /* Skip 1 cache entry */
             // _GUARD_TYPE_VERSION
                 attr = PyStackRef_FromPyObjectNew(attr_o);
                 #endif
                 STAT_INC(LOAD_ATTR, hit);
+                o = owner;
+            }
+            // _POP_TOP
+            {
+                value = o;
                 stack_pointer[-1] = attr;
                 _PyFrame_SetStackPointer(frame, stack_pointer);
-                PyStackRef_CLOSE(owner);
+                PyStackRef_XCLOSE(value);
                 stack_pointer = _PyFrame_GetStackPointer(frame);
             }
             /* Skip 5 cache entries */
index decf98865aea79bb53dd1df0eee656d115fdc6f5..e9e5bd5db1f04f01ce62df440248ce4f46fb0772 100644 (file)
@@ -570,9 +570,10 @@ dummy_func(void) {
         assert(oparg >= 2);
     }
 
-    op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr)) {
+    op(_LOAD_ATTR_INSTANCE_VALUE, (offset/1, owner -- attr, o)) {
         attr = sym_new_not_null(ctx);
         (void)offset;
+        o = owner;
     }
 
     op(_LOAD_ATTR_MODULE, (dict_version/2, index/1, owner -- attr)) {
index cdab0fd2ef872ecebaa0a6a74fd1edac2211ecfd..9c61b06d5f7eedcfa9e5e19e83b4ca75401e024b 100644 (file)
         }
 
         case _LOAD_ATTR_INSTANCE_VALUE: {
+            JitOptRef owner;
             JitOptRef attr;
+            JitOptRef o;
+            owner = stack_pointer[-1];
             uint16_t offset = (uint16_t)this_instr->operand0;
             attr = sym_new_not_null(ctx);
             (void)offset;
+            o = owner;
+            CHECK_STACK_BOUNDS(1);
             stack_pointer[-1] = attr;
+            stack_pointer[0] = o;
+            stack_pointer += 1;
+            ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
             break;
         }