gh-134584: Eliminate redundant refcounting from _LOAD_ATTR_SLOT (GH-143320)

Signed-off-by: Manjusaka <me@manjusaka.me>
Co-authored-by: Ken Jin <kenjin4096@gmail.com>
This commit is contained in:
Nadeshiko Manju 2026-01-02 01:27:02 +08:00 committed by GitHub
parent 1fb8e0eb51
commit d00d39f58e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 442 additions and 331 deletions

View File

@ -1433,7 +1433,7 @@ _PyOpcode_macro_expansion[256] = {
[LOAD_ATTR_NONDESCRIPTOR_NO_DICT] = { .nuops = 2, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_NONDESCRIPTOR_NO_DICT, 4, 5 } } },
[LOAD_ATTR_NONDESCRIPTOR_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_NONDESCRIPTOR_WITH_VALUES, 4, 5 } } },
[LOAD_ATTR_PROPERTY] = { .nuops = 5, .uops = { { _CHECK_PEP_523, OPARG_SIMPLE, 1 }, { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_PROPERTY_FRAME, 4, 5 }, { _SAVE_RETURN_OFFSET, OPARG_SAVE_RETURN_OFFSET, 9 }, { _PUSH_FRAME, OPARG_SIMPLE, 9 } } },
[LOAD_ATTR_SLOT] = { .nuops = 3, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
[LOAD_ATTR_SLOT] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_SLOT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
[LOAD_ATTR_WITH_HINT] = { .nuops = 4, .uops = { { _GUARD_TYPE_VERSION, 2, 1 }, { _LOAD_ATTR_WITH_HINT, 1, 3 }, { _POP_TOP, OPARG_SIMPLE, 4 }, { _PUSH_NULL_CONDITIONAL, OPARG_SIMPLE, 9 } } },
[LOAD_BUILD_CLASS] = { .nuops = 1, .uops = { { _LOAD_BUILD_CLASS, OPARG_SIMPLE, 0 } } },
[LOAD_COMMON_CONSTANT] = { .nuops = 1, .uops = { { _LOAD_COMMON_CONSTANT, OPARG_SIMPLE, 0 } } },

View File

@ -818,307 +818,309 @@ extern "C" {
#define _LOAD_ATTR_NONDESCRIPTOR_NO_DICT_r11 1012
#define _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES_r11 1013
#define _LOAD_ATTR_PROPERTY_FRAME_r11 1014
#define _LOAD_ATTR_SLOT_r11 1015
#define _LOAD_ATTR_WITH_HINT_r12 1016
#define _LOAD_BUILD_CLASS_r01 1017
#define _LOAD_BYTECODE_r00 1018
#define _LOAD_COMMON_CONSTANT_r01 1019
#define _LOAD_COMMON_CONSTANT_r12 1020
#define _LOAD_COMMON_CONSTANT_r23 1021
#define _LOAD_CONST_r01 1022
#define _LOAD_CONST_r12 1023
#define _LOAD_CONST_r23 1024
#define _LOAD_CONST_INLINE_r01 1025
#define _LOAD_CONST_INLINE_r12 1026
#define _LOAD_CONST_INLINE_r23 1027
#define _LOAD_CONST_INLINE_BORROW_r01 1028
#define _LOAD_CONST_INLINE_BORROW_r12 1029
#define _LOAD_CONST_INLINE_BORROW_r23 1030
#define _LOAD_CONST_UNDER_INLINE_r02 1031
#define _LOAD_CONST_UNDER_INLINE_r12 1032
#define _LOAD_CONST_UNDER_INLINE_r23 1033
#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1034
#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1035
#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1036
#define _LOAD_DEREF_r01 1037
#define _LOAD_FAST_r01 1038
#define _LOAD_FAST_r12 1039
#define _LOAD_FAST_r23 1040
#define _LOAD_FAST_0_r01 1041
#define _LOAD_FAST_0_r12 1042
#define _LOAD_FAST_0_r23 1043
#define _LOAD_FAST_1_r01 1044
#define _LOAD_FAST_1_r12 1045
#define _LOAD_FAST_1_r23 1046
#define _LOAD_FAST_2_r01 1047
#define _LOAD_FAST_2_r12 1048
#define _LOAD_FAST_2_r23 1049
#define _LOAD_FAST_3_r01 1050
#define _LOAD_FAST_3_r12 1051
#define _LOAD_FAST_3_r23 1052
#define _LOAD_FAST_4_r01 1053
#define _LOAD_FAST_4_r12 1054
#define _LOAD_FAST_4_r23 1055
#define _LOAD_FAST_5_r01 1056
#define _LOAD_FAST_5_r12 1057
#define _LOAD_FAST_5_r23 1058
#define _LOAD_FAST_6_r01 1059
#define _LOAD_FAST_6_r12 1060
#define _LOAD_FAST_6_r23 1061
#define _LOAD_FAST_7_r01 1062
#define _LOAD_FAST_7_r12 1063
#define _LOAD_FAST_7_r23 1064
#define _LOAD_FAST_AND_CLEAR_r01 1065
#define _LOAD_FAST_AND_CLEAR_r12 1066
#define _LOAD_FAST_AND_CLEAR_r23 1067
#define _LOAD_FAST_BORROW_r01 1068
#define _LOAD_FAST_BORROW_r12 1069
#define _LOAD_FAST_BORROW_r23 1070
#define _LOAD_FAST_BORROW_0_r01 1071
#define _LOAD_FAST_BORROW_0_r12 1072
#define _LOAD_FAST_BORROW_0_r23 1073
#define _LOAD_FAST_BORROW_1_r01 1074
#define _LOAD_FAST_BORROW_1_r12 1075
#define _LOAD_FAST_BORROW_1_r23 1076
#define _LOAD_FAST_BORROW_2_r01 1077
#define _LOAD_FAST_BORROW_2_r12 1078
#define _LOAD_FAST_BORROW_2_r23 1079
#define _LOAD_FAST_BORROW_3_r01 1080
#define _LOAD_FAST_BORROW_3_r12 1081
#define _LOAD_FAST_BORROW_3_r23 1082
#define _LOAD_FAST_BORROW_4_r01 1083
#define _LOAD_FAST_BORROW_4_r12 1084
#define _LOAD_FAST_BORROW_4_r23 1085
#define _LOAD_FAST_BORROW_5_r01 1086
#define _LOAD_FAST_BORROW_5_r12 1087
#define _LOAD_FAST_BORROW_5_r23 1088
#define _LOAD_FAST_BORROW_6_r01 1089
#define _LOAD_FAST_BORROW_6_r12 1090
#define _LOAD_FAST_BORROW_6_r23 1091
#define _LOAD_FAST_BORROW_7_r01 1092
#define _LOAD_FAST_BORROW_7_r12 1093
#define _LOAD_FAST_BORROW_7_r23 1094
#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1095
#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1096
#define _LOAD_FAST_CHECK_r01 1097
#define _LOAD_FAST_CHECK_r12 1098
#define _LOAD_FAST_CHECK_r23 1099
#define _LOAD_FAST_LOAD_FAST_r02 1100
#define _LOAD_FAST_LOAD_FAST_r13 1101
#define _LOAD_FROM_DICT_OR_DEREF_r11 1102
#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1103
#define _LOAD_GLOBAL_r00 1104
#define _LOAD_GLOBAL_BUILTINS_r01 1105
#define _LOAD_GLOBAL_MODULE_r01 1106
#define _LOAD_LOCALS_r01 1107
#define _LOAD_LOCALS_r12 1108
#define _LOAD_LOCALS_r23 1109
#define _LOAD_NAME_r01 1110
#define _LOAD_SMALL_INT_r01 1111
#define _LOAD_SMALL_INT_r12 1112
#define _LOAD_SMALL_INT_r23 1113
#define _LOAD_SMALL_INT_0_r01 1114
#define _LOAD_SMALL_INT_0_r12 1115
#define _LOAD_SMALL_INT_0_r23 1116
#define _LOAD_SMALL_INT_1_r01 1117
#define _LOAD_SMALL_INT_1_r12 1118
#define _LOAD_SMALL_INT_1_r23 1119
#define _LOAD_SMALL_INT_2_r01 1120
#define _LOAD_SMALL_INT_2_r12 1121
#define _LOAD_SMALL_INT_2_r23 1122
#define _LOAD_SMALL_INT_3_r01 1123
#define _LOAD_SMALL_INT_3_r12 1124
#define _LOAD_SMALL_INT_3_r23 1125
#define _LOAD_SPECIAL_r00 1126
#define _LOAD_SUPER_ATTR_ATTR_r31 1127
#define _LOAD_SUPER_ATTR_METHOD_r32 1128
#define _MAKE_CALLARGS_A_TUPLE_r33 1129
#define _MAKE_CELL_r00 1130
#define _MAKE_FUNCTION_r11 1131
#define _MAKE_WARM_r00 1132
#define _MAKE_WARM_r11 1133
#define _MAKE_WARM_r22 1134
#define _MAKE_WARM_r33 1135
#define _MAP_ADD_r20 1136
#define _MATCH_CLASS_r31 1137
#define _MATCH_KEYS_r23 1138
#define _MATCH_MAPPING_r02 1139
#define _MATCH_MAPPING_r12 1140
#define _MATCH_MAPPING_r23 1141
#define _MATCH_SEQUENCE_r02 1142
#define _MATCH_SEQUENCE_r12 1143
#define _MATCH_SEQUENCE_r23 1144
#define _MAYBE_EXPAND_METHOD_r00 1145
#define _MAYBE_EXPAND_METHOD_KW_r11 1146
#define _MONITOR_CALL_r00 1147
#define _MONITOR_CALL_KW_r11 1148
#define _MONITOR_JUMP_BACKWARD_r00 1149
#define _MONITOR_JUMP_BACKWARD_r11 1150
#define _MONITOR_JUMP_BACKWARD_r22 1151
#define _MONITOR_JUMP_BACKWARD_r33 1152
#define _MONITOR_RESUME_r00 1153
#define _NOP_r00 1154
#define _NOP_r11 1155
#define _NOP_r22 1156
#define _NOP_r33 1157
#define _POP_CALL_r20 1158
#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1159
#define _POP_CALL_ONE_r30 1160
#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1161
#define _POP_CALL_TWO_r30 1162
#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1163
#define _POP_EXCEPT_r10 1164
#define _POP_ITER_r20 1165
#define _POP_JUMP_IF_FALSE_r00 1166
#define _POP_JUMP_IF_FALSE_r10 1167
#define _POP_JUMP_IF_FALSE_r21 1168
#define _POP_JUMP_IF_FALSE_r32 1169
#define _POP_JUMP_IF_TRUE_r00 1170
#define _POP_JUMP_IF_TRUE_r10 1171
#define _POP_JUMP_IF_TRUE_r21 1172
#define _POP_JUMP_IF_TRUE_r32 1173
#define _POP_TOP_r10 1174
#define _POP_TOP_FLOAT_r00 1175
#define _POP_TOP_FLOAT_r10 1176
#define _POP_TOP_FLOAT_r21 1177
#define _POP_TOP_FLOAT_r32 1178
#define _POP_TOP_INT_r00 1179
#define _POP_TOP_INT_r10 1180
#define _POP_TOP_INT_r21 1181
#define _POP_TOP_INT_r32 1182
#define _POP_TOP_LOAD_CONST_INLINE_r11 1183
#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1184
#define _POP_TOP_NOP_r00 1185
#define _POP_TOP_NOP_r10 1186
#define _POP_TOP_NOP_r21 1187
#define _POP_TOP_NOP_r32 1188
#define _POP_TOP_UNICODE_r00 1189
#define _POP_TOP_UNICODE_r10 1190
#define _POP_TOP_UNICODE_r21 1191
#define _POP_TOP_UNICODE_r32 1192
#define _POP_TWO_r20 1193
#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1194
#define _PUSH_EXC_INFO_r02 1195
#define _PUSH_EXC_INFO_r12 1196
#define _PUSH_EXC_INFO_r23 1197
#define _PUSH_FRAME_r10 1198
#define _PUSH_NULL_r01 1199
#define _PUSH_NULL_r12 1200
#define _PUSH_NULL_r23 1201
#define _PUSH_NULL_CONDITIONAL_r00 1202
#define _PY_FRAME_GENERAL_r01 1203
#define _PY_FRAME_KW_r11 1204
#define _QUICKEN_RESUME_r00 1205
#define _QUICKEN_RESUME_r11 1206
#define _QUICKEN_RESUME_r22 1207
#define _QUICKEN_RESUME_r33 1208
#define _REPLACE_WITH_TRUE_r11 1209
#define _RESUME_CHECK_r00 1210
#define _RESUME_CHECK_r11 1211
#define _RESUME_CHECK_r22 1212
#define _RESUME_CHECK_r33 1213
#define _RETURN_GENERATOR_r01 1214
#define _RETURN_VALUE_r11 1215
#define _SAVE_RETURN_OFFSET_r00 1216
#define _SAVE_RETURN_OFFSET_r11 1217
#define _SAVE_RETURN_OFFSET_r22 1218
#define _SAVE_RETURN_OFFSET_r33 1219
#define _SEND_r22 1220
#define _SEND_GEN_FRAME_r22 1221
#define _SETUP_ANNOTATIONS_r00 1222
#define _SET_ADD_r10 1223
#define _SET_FUNCTION_ATTRIBUTE_r01 1224
#define _SET_FUNCTION_ATTRIBUTE_r11 1225
#define _SET_FUNCTION_ATTRIBUTE_r21 1226
#define _SET_FUNCTION_ATTRIBUTE_r32 1227
#define _SET_IP_r00 1228
#define _SET_IP_r11 1229
#define _SET_IP_r22 1230
#define _SET_IP_r33 1231
#define _SET_UPDATE_r10 1232
#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1233
#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1234
#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1235
#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1236
#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1237
#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1238
#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1239
#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1240
#define _SPILL_OR_RELOAD_r01 1241
#define _SPILL_OR_RELOAD_r02 1242
#define _SPILL_OR_RELOAD_r03 1243
#define _SPILL_OR_RELOAD_r10 1244
#define _SPILL_OR_RELOAD_r12 1245
#define _SPILL_OR_RELOAD_r13 1246
#define _SPILL_OR_RELOAD_r20 1247
#define _SPILL_OR_RELOAD_r21 1248
#define _SPILL_OR_RELOAD_r23 1249
#define _SPILL_OR_RELOAD_r30 1250
#define _SPILL_OR_RELOAD_r31 1251
#define _SPILL_OR_RELOAD_r32 1252
#define _START_EXECUTOR_r00 1253
#define _STORE_ATTR_r20 1254
#define _STORE_ATTR_INSTANCE_VALUE_r21 1255
#define _STORE_ATTR_SLOT_r21 1256
#define _STORE_ATTR_WITH_HINT_r21 1257
#define _STORE_DEREF_r10 1258
#define _STORE_FAST_r10 1259
#define _STORE_FAST_0_r10 1260
#define _STORE_FAST_1_r10 1261
#define _STORE_FAST_2_r10 1262
#define _STORE_FAST_3_r10 1263
#define _STORE_FAST_4_r10 1264
#define _STORE_FAST_5_r10 1265
#define _STORE_FAST_6_r10 1266
#define _STORE_FAST_7_r10 1267
#define _STORE_FAST_LOAD_FAST_r11 1268
#define _STORE_FAST_STORE_FAST_r20 1269
#define _STORE_GLOBAL_r10 1270
#define _STORE_NAME_r10 1271
#define _STORE_SLICE_r30 1272
#define _STORE_SUBSCR_r30 1273
#define _STORE_SUBSCR_DICT_r31 1274
#define _STORE_SUBSCR_LIST_INT_r32 1275
#define _SWAP_r11 1276
#define _SWAP_2_r02 1277
#define _SWAP_2_r12 1278
#define _SWAP_2_r22 1279
#define _SWAP_2_r33 1280
#define _SWAP_3_r03 1281
#define _SWAP_3_r13 1282
#define _SWAP_3_r23 1283
#define _SWAP_3_r33 1284
#define _TIER2_RESUME_CHECK_r00 1285
#define _TIER2_RESUME_CHECK_r11 1286
#define _TIER2_RESUME_CHECK_r22 1287
#define _TIER2_RESUME_CHECK_r33 1288
#define _TO_BOOL_r11 1289
#define _TO_BOOL_BOOL_r01 1290
#define _TO_BOOL_BOOL_r11 1291
#define _TO_BOOL_BOOL_r22 1292
#define _TO_BOOL_BOOL_r33 1293
#define _TO_BOOL_INT_r11 1294
#define _TO_BOOL_LIST_r11 1295
#define _TO_BOOL_NONE_r01 1296
#define _TO_BOOL_NONE_r11 1297
#define _TO_BOOL_NONE_r22 1298
#define _TO_BOOL_NONE_r33 1299
#define _TO_BOOL_STR_r11 1300
#define _TRACE_RECORD_r00 1301
#define _UNARY_INVERT_r11 1302
#define _UNARY_NEGATIVE_r11 1303
#define _UNARY_NOT_r01 1304
#define _UNARY_NOT_r11 1305
#define _UNARY_NOT_r22 1306
#define _UNARY_NOT_r33 1307
#define _UNPACK_EX_r10 1308
#define _UNPACK_SEQUENCE_r10 1309
#define _UNPACK_SEQUENCE_LIST_r10 1310
#define _UNPACK_SEQUENCE_TUPLE_r10 1311
#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1312
#define _WITH_EXCEPT_START_r33 1313
#define _YIELD_VALUE_r11 1314
#define MAX_UOP_REGS_ID 1314
#define _LOAD_ATTR_SLOT_r02 1015
#define _LOAD_ATTR_SLOT_r12 1016
#define _LOAD_ATTR_SLOT_r23 1017
#define _LOAD_ATTR_WITH_HINT_r12 1018
#define _LOAD_BUILD_CLASS_r01 1019
#define _LOAD_BYTECODE_r00 1020
#define _LOAD_COMMON_CONSTANT_r01 1021
#define _LOAD_COMMON_CONSTANT_r12 1022
#define _LOAD_COMMON_CONSTANT_r23 1023
#define _LOAD_CONST_r01 1024
#define _LOAD_CONST_r12 1025
#define _LOAD_CONST_r23 1026
#define _LOAD_CONST_INLINE_r01 1027
#define _LOAD_CONST_INLINE_r12 1028
#define _LOAD_CONST_INLINE_r23 1029
#define _LOAD_CONST_INLINE_BORROW_r01 1030
#define _LOAD_CONST_INLINE_BORROW_r12 1031
#define _LOAD_CONST_INLINE_BORROW_r23 1032
#define _LOAD_CONST_UNDER_INLINE_r02 1033
#define _LOAD_CONST_UNDER_INLINE_r12 1034
#define _LOAD_CONST_UNDER_INLINE_r23 1035
#define _LOAD_CONST_UNDER_INLINE_BORROW_r02 1036
#define _LOAD_CONST_UNDER_INLINE_BORROW_r12 1037
#define _LOAD_CONST_UNDER_INLINE_BORROW_r23 1038
#define _LOAD_DEREF_r01 1039
#define _LOAD_FAST_r01 1040
#define _LOAD_FAST_r12 1041
#define _LOAD_FAST_r23 1042
#define _LOAD_FAST_0_r01 1043
#define _LOAD_FAST_0_r12 1044
#define _LOAD_FAST_0_r23 1045
#define _LOAD_FAST_1_r01 1046
#define _LOAD_FAST_1_r12 1047
#define _LOAD_FAST_1_r23 1048
#define _LOAD_FAST_2_r01 1049
#define _LOAD_FAST_2_r12 1050
#define _LOAD_FAST_2_r23 1051
#define _LOAD_FAST_3_r01 1052
#define _LOAD_FAST_3_r12 1053
#define _LOAD_FAST_3_r23 1054
#define _LOAD_FAST_4_r01 1055
#define _LOAD_FAST_4_r12 1056
#define _LOAD_FAST_4_r23 1057
#define _LOAD_FAST_5_r01 1058
#define _LOAD_FAST_5_r12 1059
#define _LOAD_FAST_5_r23 1060
#define _LOAD_FAST_6_r01 1061
#define _LOAD_FAST_6_r12 1062
#define _LOAD_FAST_6_r23 1063
#define _LOAD_FAST_7_r01 1064
#define _LOAD_FAST_7_r12 1065
#define _LOAD_FAST_7_r23 1066
#define _LOAD_FAST_AND_CLEAR_r01 1067
#define _LOAD_FAST_AND_CLEAR_r12 1068
#define _LOAD_FAST_AND_CLEAR_r23 1069
#define _LOAD_FAST_BORROW_r01 1070
#define _LOAD_FAST_BORROW_r12 1071
#define _LOAD_FAST_BORROW_r23 1072
#define _LOAD_FAST_BORROW_0_r01 1073
#define _LOAD_FAST_BORROW_0_r12 1074
#define _LOAD_FAST_BORROW_0_r23 1075
#define _LOAD_FAST_BORROW_1_r01 1076
#define _LOAD_FAST_BORROW_1_r12 1077
#define _LOAD_FAST_BORROW_1_r23 1078
#define _LOAD_FAST_BORROW_2_r01 1079
#define _LOAD_FAST_BORROW_2_r12 1080
#define _LOAD_FAST_BORROW_2_r23 1081
#define _LOAD_FAST_BORROW_3_r01 1082
#define _LOAD_FAST_BORROW_3_r12 1083
#define _LOAD_FAST_BORROW_3_r23 1084
#define _LOAD_FAST_BORROW_4_r01 1085
#define _LOAD_FAST_BORROW_4_r12 1086
#define _LOAD_FAST_BORROW_4_r23 1087
#define _LOAD_FAST_BORROW_5_r01 1088
#define _LOAD_FAST_BORROW_5_r12 1089
#define _LOAD_FAST_BORROW_5_r23 1090
#define _LOAD_FAST_BORROW_6_r01 1091
#define _LOAD_FAST_BORROW_6_r12 1092
#define _LOAD_FAST_BORROW_6_r23 1093
#define _LOAD_FAST_BORROW_7_r01 1094
#define _LOAD_FAST_BORROW_7_r12 1095
#define _LOAD_FAST_BORROW_7_r23 1096
#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1097
#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1098
#define _LOAD_FAST_CHECK_r01 1099
#define _LOAD_FAST_CHECK_r12 1100
#define _LOAD_FAST_CHECK_r23 1101
#define _LOAD_FAST_LOAD_FAST_r02 1102
#define _LOAD_FAST_LOAD_FAST_r13 1103
#define _LOAD_FROM_DICT_OR_DEREF_r11 1104
#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1105
#define _LOAD_GLOBAL_r00 1106
#define _LOAD_GLOBAL_BUILTINS_r01 1107
#define _LOAD_GLOBAL_MODULE_r01 1108
#define _LOAD_LOCALS_r01 1109
#define _LOAD_LOCALS_r12 1110
#define _LOAD_LOCALS_r23 1111
#define _LOAD_NAME_r01 1112
#define _LOAD_SMALL_INT_r01 1113
#define _LOAD_SMALL_INT_r12 1114
#define _LOAD_SMALL_INT_r23 1115
#define _LOAD_SMALL_INT_0_r01 1116
#define _LOAD_SMALL_INT_0_r12 1117
#define _LOAD_SMALL_INT_0_r23 1118
#define _LOAD_SMALL_INT_1_r01 1119
#define _LOAD_SMALL_INT_1_r12 1120
#define _LOAD_SMALL_INT_1_r23 1121
#define _LOAD_SMALL_INT_2_r01 1122
#define _LOAD_SMALL_INT_2_r12 1123
#define _LOAD_SMALL_INT_2_r23 1124
#define _LOAD_SMALL_INT_3_r01 1125
#define _LOAD_SMALL_INT_3_r12 1126
#define _LOAD_SMALL_INT_3_r23 1127
#define _LOAD_SPECIAL_r00 1128
#define _LOAD_SUPER_ATTR_ATTR_r31 1129
#define _LOAD_SUPER_ATTR_METHOD_r32 1130
#define _MAKE_CALLARGS_A_TUPLE_r33 1131
#define _MAKE_CELL_r00 1132
#define _MAKE_FUNCTION_r11 1133
#define _MAKE_WARM_r00 1134
#define _MAKE_WARM_r11 1135
#define _MAKE_WARM_r22 1136
#define _MAKE_WARM_r33 1137
#define _MAP_ADD_r20 1138
#define _MATCH_CLASS_r31 1139
#define _MATCH_KEYS_r23 1140
#define _MATCH_MAPPING_r02 1141
#define _MATCH_MAPPING_r12 1142
#define _MATCH_MAPPING_r23 1143
#define _MATCH_SEQUENCE_r02 1144
#define _MATCH_SEQUENCE_r12 1145
#define _MATCH_SEQUENCE_r23 1146
#define _MAYBE_EXPAND_METHOD_r00 1147
#define _MAYBE_EXPAND_METHOD_KW_r11 1148
#define _MONITOR_CALL_r00 1149
#define _MONITOR_CALL_KW_r11 1150
#define _MONITOR_JUMP_BACKWARD_r00 1151
#define _MONITOR_JUMP_BACKWARD_r11 1152
#define _MONITOR_JUMP_BACKWARD_r22 1153
#define _MONITOR_JUMP_BACKWARD_r33 1154
#define _MONITOR_RESUME_r00 1155
#define _NOP_r00 1156
#define _NOP_r11 1157
#define _NOP_r22 1158
#define _NOP_r33 1159
#define _POP_CALL_r20 1160
#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1161
#define _POP_CALL_ONE_r30 1162
#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1163
#define _POP_CALL_TWO_r30 1164
#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1165
#define _POP_EXCEPT_r10 1166
#define _POP_ITER_r20 1167
#define _POP_JUMP_IF_FALSE_r00 1168
#define _POP_JUMP_IF_FALSE_r10 1169
#define _POP_JUMP_IF_FALSE_r21 1170
#define _POP_JUMP_IF_FALSE_r32 1171
#define _POP_JUMP_IF_TRUE_r00 1172
#define _POP_JUMP_IF_TRUE_r10 1173
#define _POP_JUMP_IF_TRUE_r21 1174
#define _POP_JUMP_IF_TRUE_r32 1175
#define _POP_TOP_r10 1176
#define _POP_TOP_FLOAT_r00 1177
#define _POP_TOP_FLOAT_r10 1178
#define _POP_TOP_FLOAT_r21 1179
#define _POP_TOP_FLOAT_r32 1180
#define _POP_TOP_INT_r00 1181
#define _POP_TOP_INT_r10 1182
#define _POP_TOP_INT_r21 1183
#define _POP_TOP_INT_r32 1184
#define _POP_TOP_LOAD_CONST_INLINE_r11 1185
#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1186
#define _POP_TOP_NOP_r00 1187
#define _POP_TOP_NOP_r10 1188
#define _POP_TOP_NOP_r21 1189
#define _POP_TOP_NOP_r32 1190
#define _POP_TOP_UNICODE_r00 1191
#define _POP_TOP_UNICODE_r10 1192
#define _POP_TOP_UNICODE_r21 1193
#define _POP_TOP_UNICODE_r32 1194
#define _POP_TWO_r20 1195
#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1196
#define _PUSH_EXC_INFO_r02 1197
#define _PUSH_EXC_INFO_r12 1198
#define _PUSH_EXC_INFO_r23 1199
#define _PUSH_FRAME_r10 1200
#define _PUSH_NULL_r01 1201
#define _PUSH_NULL_r12 1202
#define _PUSH_NULL_r23 1203
#define _PUSH_NULL_CONDITIONAL_r00 1204
#define _PY_FRAME_GENERAL_r01 1205
#define _PY_FRAME_KW_r11 1206
#define _QUICKEN_RESUME_r00 1207
#define _QUICKEN_RESUME_r11 1208
#define _QUICKEN_RESUME_r22 1209
#define _QUICKEN_RESUME_r33 1210
#define _REPLACE_WITH_TRUE_r11 1211
#define _RESUME_CHECK_r00 1212
#define _RESUME_CHECK_r11 1213
#define _RESUME_CHECK_r22 1214
#define _RESUME_CHECK_r33 1215
#define _RETURN_GENERATOR_r01 1216
#define _RETURN_VALUE_r11 1217
#define _SAVE_RETURN_OFFSET_r00 1218
#define _SAVE_RETURN_OFFSET_r11 1219
#define _SAVE_RETURN_OFFSET_r22 1220
#define _SAVE_RETURN_OFFSET_r33 1221
#define _SEND_r22 1222
#define _SEND_GEN_FRAME_r22 1223
#define _SETUP_ANNOTATIONS_r00 1224
#define _SET_ADD_r10 1225
#define _SET_FUNCTION_ATTRIBUTE_r01 1226
#define _SET_FUNCTION_ATTRIBUTE_r11 1227
#define _SET_FUNCTION_ATTRIBUTE_r21 1228
#define _SET_FUNCTION_ATTRIBUTE_r32 1229
#define _SET_IP_r00 1230
#define _SET_IP_r11 1231
#define _SET_IP_r22 1232
#define _SET_IP_r33 1233
#define _SET_UPDATE_r10 1234
#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r02 1235
#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r12 1236
#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r22 1237
#define _SHUFFLE_2_LOAD_CONST_INLINE_BORROW_r32 1238
#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r03 1239
#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r13 1240
#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r23 1241
#define _SHUFFLE_3_LOAD_CONST_INLINE_BORROW_r33 1242
#define _SPILL_OR_RELOAD_r01 1243
#define _SPILL_OR_RELOAD_r02 1244
#define _SPILL_OR_RELOAD_r03 1245
#define _SPILL_OR_RELOAD_r10 1246
#define _SPILL_OR_RELOAD_r12 1247
#define _SPILL_OR_RELOAD_r13 1248
#define _SPILL_OR_RELOAD_r20 1249
#define _SPILL_OR_RELOAD_r21 1250
#define _SPILL_OR_RELOAD_r23 1251
#define _SPILL_OR_RELOAD_r30 1252
#define _SPILL_OR_RELOAD_r31 1253
#define _SPILL_OR_RELOAD_r32 1254
#define _START_EXECUTOR_r00 1255
#define _STORE_ATTR_r20 1256
#define _STORE_ATTR_INSTANCE_VALUE_r21 1257
#define _STORE_ATTR_SLOT_r21 1258
#define _STORE_ATTR_WITH_HINT_r21 1259
#define _STORE_DEREF_r10 1260
#define _STORE_FAST_r10 1261
#define _STORE_FAST_0_r10 1262
#define _STORE_FAST_1_r10 1263
#define _STORE_FAST_2_r10 1264
#define _STORE_FAST_3_r10 1265
#define _STORE_FAST_4_r10 1266
#define _STORE_FAST_5_r10 1267
#define _STORE_FAST_6_r10 1268
#define _STORE_FAST_7_r10 1269
#define _STORE_FAST_LOAD_FAST_r11 1270
#define _STORE_FAST_STORE_FAST_r20 1271
#define _STORE_GLOBAL_r10 1272
#define _STORE_NAME_r10 1273
#define _STORE_SLICE_r30 1274
#define _STORE_SUBSCR_r30 1275
#define _STORE_SUBSCR_DICT_r31 1276
#define _STORE_SUBSCR_LIST_INT_r32 1277
#define _SWAP_r11 1278
#define _SWAP_2_r02 1279
#define _SWAP_2_r12 1280
#define _SWAP_2_r22 1281
#define _SWAP_2_r33 1282
#define _SWAP_3_r03 1283
#define _SWAP_3_r13 1284
#define _SWAP_3_r23 1285
#define _SWAP_3_r33 1286
#define _TIER2_RESUME_CHECK_r00 1287
#define _TIER2_RESUME_CHECK_r11 1288
#define _TIER2_RESUME_CHECK_r22 1289
#define _TIER2_RESUME_CHECK_r33 1290
#define _TO_BOOL_r11 1291
#define _TO_BOOL_BOOL_r01 1292
#define _TO_BOOL_BOOL_r11 1293
#define _TO_BOOL_BOOL_r22 1294
#define _TO_BOOL_BOOL_r33 1295
#define _TO_BOOL_INT_r11 1296
#define _TO_BOOL_LIST_r11 1297
#define _TO_BOOL_NONE_r01 1298
#define _TO_BOOL_NONE_r11 1299
#define _TO_BOOL_NONE_r22 1300
#define _TO_BOOL_NONE_r33 1301
#define _TO_BOOL_STR_r11 1302
#define _TRACE_RECORD_r00 1303
#define _UNARY_INVERT_r11 1304
#define _UNARY_NEGATIVE_r11 1305
#define _UNARY_NOT_r01 1306
#define _UNARY_NOT_r11 1307
#define _UNARY_NOT_r22 1308
#define _UNARY_NOT_r33 1309
#define _UNPACK_EX_r10 1310
#define _UNPACK_SEQUENCE_r10 1311
#define _UNPACK_SEQUENCE_LIST_r10 1312
#define _UNPACK_SEQUENCE_TUPLE_r10 1313
#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1314
#define _WITH_EXCEPT_START_r33 1315
#define _YIELD_VALUE_r11 1316
#define MAX_UOP_REGS_ID 1316
#ifdef __cplusplus
}

View File

@ -193,7 +193,7 @@ const uint32_t _PyUop_Flags[MAX_UOP_ID+1] = {
[_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,
[_LOAD_ATTR_SLOT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG,
[_LOAD_ATTR_SLOT] = HAS_DEOPT_FLAG,
[_CHECK_ATTR_CLASS] = HAS_EXIT_FLAG,
[_LOAD_ATTR_CLASS] = HAS_ESCAPES_FLAG,
[_LOAD_ATTR_PROPERTY_FRAME] = HAS_ARG_FLAG | HAS_DEOPT_FLAG,
@ -1791,11 +1791,11 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
},
},
[_LOAD_ATTR_SLOT] = {
.best = { 1, 1, 1, 1 },
.best = { 0, 1, 2, 2 },
.entries = {
{ -1, -1, -1 },
{ 1, 1, _LOAD_ATTR_SLOT_r11 },
{ -1, -1, -1 },
{ 2, 0, _LOAD_ATTR_SLOT_r02 },
{ 2, 1, _LOAD_ATTR_SLOT_r12 },
{ 3, 2, _LOAD_ATTR_SLOT_r23 },
{ -1, -1, -1 },
},
},
@ -3569,7 +3569,9 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {
[_LOAD_ATTR_INSTANCE_VALUE_r23] = _LOAD_ATTR_INSTANCE_VALUE,
[_LOAD_ATTR_MODULE_r11] = _LOAD_ATTR_MODULE,
[_LOAD_ATTR_WITH_HINT_r12] = _LOAD_ATTR_WITH_HINT,
[_LOAD_ATTR_SLOT_r11] = _LOAD_ATTR_SLOT,
[_LOAD_ATTR_SLOT_r02] = _LOAD_ATTR_SLOT,
[_LOAD_ATTR_SLOT_r12] = _LOAD_ATTR_SLOT,
[_LOAD_ATTR_SLOT_r23] = _LOAD_ATTR_SLOT,
[_CHECK_ATTR_CLASS_r01] = _CHECK_ATTR_CLASS,
[_CHECK_ATTR_CLASS_r11] = _CHECK_ATTR_CLASS,
[_CHECK_ATTR_CLASS_r22] = _CHECK_ATTR_CLASS,
@ -4544,7 +4546,9 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
[_LOAD_ATTR_PROPERTY_FRAME] = "_LOAD_ATTR_PROPERTY_FRAME",
[_LOAD_ATTR_PROPERTY_FRAME_r11] = "_LOAD_ATTR_PROPERTY_FRAME_r11",
[_LOAD_ATTR_SLOT] = "_LOAD_ATTR_SLOT",
[_LOAD_ATTR_SLOT_r11] = "_LOAD_ATTR_SLOT_r11",
[_LOAD_ATTR_SLOT_r02] = "_LOAD_ATTR_SLOT_r02",
[_LOAD_ATTR_SLOT_r12] = "_LOAD_ATTR_SLOT_r12",
[_LOAD_ATTR_SLOT_r23] = "_LOAD_ATTR_SLOT_r23",
[_LOAD_ATTR_WITH_HINT] = "_LOAD_ATTR_WITH_HINT",
[_LOAD_ATTR_WITH_HINT_r12] = "_LOAD_ATTR_WITH_HINT_r12",
[_LOAD_BUILD_CLASS] = "_LOAD_BUILD_CLASS",

View File

@ -2593,6 +2593,25 @@ class TestUopsOptimization(unittest.TestCase):
self.assertNotIn("_POP_TOP", uops)
self.assertIn("_POP_TOP_NOP", uops)
def test_load_addr_slot(self):
def testfunc(n):
class C:
__slots__ = ('x',)
c = C()
c.x = 42
x = 0
for _ in range(n):
x += c.x
return x
res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD)
self.assertEqual(res, 42 * TIER2_THRESHOLD)
self.assertIsNotNone(ex)
uops = get_opnames(ex)
self.assertIn("_LOAD_ATTR_SLOT", 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

View File

@ -0,0 +1 @@
Eliminate redundant refcounting from ``_LOAD_ATTR_SLOT``.

View File

@ -2485,7 +2485,7 @@ dummy_func(
unused/5 +
_PUSH_NULL_CONDITIONAL;
op(_LOAD_ATTR_SLOT, (index/1, owner -- attr)) {
op(_LOAD_ATTR_SLOT, (index/1, owner -- attr, o)) {
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyObject **addr = (PyObject **)((char *)owner_o + index);
@ -2498,13 +2498,15 @@ dummy_func(
attr = PyStackRef_FromPyObjectNew(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
DECREF_INPUTS();
o = owner;
DEAD(owner);
}
macro(LOAD_ATTR_SLOT) =
unused/1 +
_GUARD_TYPE_VERSION +
_LOAD_ATTR_SLOT + // NOTE: This action may also deopt
POP_TOP +
unused/5 +
_PUSH_NULL_CONDITIONAL;

View File

@ -8532,11 +8532,49 @@
break;
}
case _LOAD_ATTR_SLOT_r11: {
case _LOAD_ATTR_SLOT_r02: {
CHECK_CURRENT_CACHED_VALUES(0);
assert(WITHIN_STACK_BOUNDS_IGNORING_CACHE());
_PyStackRef owner;
_PyStackRef attr;
_PyStackRef o;
owner = stack_pointer[-1];
uint16_t index = (uint16_t)CURRENT_OPERAND0_16();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyObject **addr = (PyObject **)((char *)owner_o + index);
PyObject *attr_o = FT_ATOMIC_LOAD_PTR(*addr);
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(addr, attr_o, &attr);
if (!increfed) {
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_SLOT_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 index = (uint16_t)CURRENT_OPERAND0_16();
@ -8561,21 +8599,52 @@
attr = PyStackRef_FromPyObjectNew(attr_o);
#endif
STAT_INC(LOAD_ATTR, hit);
stack_pointer[0] = owner;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
_PyFrame_SetStackPointer(frame, stack_pointer);
_PyStackRef tmp = owner;
owner = attr;
stack_pointer[-1] = owner;
PyStackRef_CLOSE(tmp);
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_SLOT_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 index = (uint16_t)CURRENT_OPERAND0_16();
PyObject *owner_o = PyStackRef_AsPyObjectBorrow(owner);
PyObject **addr = (PyObject **)((char *)owner_o + index);
PyObject *attr_o = FT_ATOMIC_LOAD_PTR(*addr);
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(addr, attr_o, &attr);
if (!increfed) {
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;
}

View File

@ -8284,6 +8284,8 @@
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
@ -8320,11 +8322,14 @@
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 tmp = owner;
owner = attr;
stack_pointer[-1] = owner;
PyStackRef_CLOSE(tmp);
PyStackRef_XCLOSE(value);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
/* Skip 5 cache entries */

View File

@ -661,9 +661,10 @@ dummy_func(void) {
o = owner;
}
op(_LOAD_ATTR_SLOT, (index/1, owner -- attr)) {
op(_LOAD_ATTR_SLOT, (index/1, owner -- attr, o)) {
attr = sym_new_not_null(ctx);
(void)index;
o = owner;
}
op(_LOAD_ATTR_CLASS, (descr/4, owner -- attr)) {

View File

@ -1666,11 +1666,19 @@
}
case _LOAD_ATTR_SLOT: {
JitOptRef owner;
JitOptRef attr;
JitOptRef o;
owner = stack_pointer[-1];
uint16_t index = (uint16_t)this_instr->operand0;
attr = sym_new_not_null(ctx);
(void)index;
o = owner;
CHECK_STACK_BOUNDS(1);
stack_pointer[-1] = attr;
stack_pointer[0] = o;
stack_pointer += 1;
ASSERT_WITHIN_STACK_BOUNDS(__FILE__, __LINE__);
break;
}