https://github.com/python/cpython/commit/d00d39f58e522a8968a741876a5dad5505f2c4df
commit: d00d39f58e522a8968a741876a5dad5505f2c4df
branch: main
author: Nadeshiko Manju <[email protected]>
committer: Fidget-Spinner <[email protected]>
date: 2026-01-01T17:27:02Z
summary:

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

Signed-off-by: Manjusaka <[email protected]>
Co-authored-by: Ken Jin <[email protected]>

files:
A 
Misc/NEWS.d/next/Core_and_Builtins/2026-01-01-17-01-24.gh-issue-134584.nis8LC.rst
M Include/internal/pycore_opcode_metadata.h
M Include/internal/pycore_uop_ids.h
M Include/internal/pycore_uop_metadata.h
M Lib/test/test_capi/test_opt.py
M Python/bytecodes.c
M Python/executor_cases.c.h
M Python/generated_cases.c.h
M Python/optimizer_bytecodes.c
M Python/optimizer_cases.c.h

diff --git a/Include/internal/pycore_opcode_metadata.h 
b/Include/internal/pycore_opcode_metadata.h
index adce512d32941f..830b49352e23a3 100644
--- a/Include/internal/pycore_opcode_metadata.h
+++ b/Include/internal/pycore_opcode_metadata.h
@@ -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 } } },
diff --git a/Include/internal/pycore_uop_ids.h 
b/Include/internal/pycore_uop_ids.h
index a7da996a99ae2d..e6e6c8266024aa 100644
--- a/Include/internal/pycore_uop_ids.h
+++ b/Include/internal/pycore_uop_ids.h
@@ -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
 }
diff --git a/Include/internal/pycore_uop_metadata.h 
b/Include/internal/pycore_uop_metadata.h
index 8c65565890b557..214f58b22338e1 100644
--- a/Include/internal/pycore_uop_metadata.h
+++ b/Include/internal/pycore_uop_metadata.h
@@ -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",
diff --git a/Lib/test/test_capi/test_opt.py b/Lib/test/test_capi/test_opt.py
index 93433b841740b4..bb4aa6ff113f47 100644
--- a/Lib/test/test_capi/test_opt.py
+++ b/Lib/test/test_capi/test_opt.py
@@ -2593,6 +2593,25 @@ class C:
         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
diff --git 
a/Misc/NEWS.d/next/Core_and_Builtins/2026-01-01-17-01-24.gh-issue-134584.nis8LC.rst
 
b/Misc/NEWS.d/next/Core_and_Builtins/2026-01-01-17-01-24.gh-issue-134584.nis8LC.rst
new file mode 100644
index 00000000000000..ac5a2b6e8adaff
--- /dev/null
+++ 
b/Misc/NEWS.d/next/Core_and_Builtins/2026-01-01-17-01-24.gh-issue-134584.nis8LC.rst
@@ -0,0 +1 @@
+Eliminate redundant refcounting from ``_LOAD_ATTR_SLOT``.
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 0b74a03a4e56d4..829efafa67d6e1 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -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;
 
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index adac2914803d46..0a2b794988c961 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -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;
         }
diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h
index 6e4ba9e9ece07b..716d87fd97ac4a 100644
--- a/Python/generated_cases.c.h
+++ b/Python/generated_cases.c.h
@@ -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 */
diff --git a/Python/optimizer_bytecodes.c b/Python/optimizer_bytecodes.c
index aaa786ae5fd724..53c7cb724e1b65 100644
--- a/Python/optimizer_bytecodes.c
+++ b/Python/optimizer_bytecodes.c
@@ -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)) {
diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h
index 87c2d1a779b990..49e6ac560306fe 100644
--- a/Python/optimizer_cases.c.h
+++ b/Python/optimizer_cases.c.h
@@ -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;
         }
 

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to