gh-134584: Eliminate redundant refcounting from _LOAD_ATTR_INSTANCE_VALUE (GH-142769)

Signed-off-by: Manjusaka <me@manjusaka.me>
This commit is contained in:
Nadeshiko Manju 2025-12-17 05:39:20 +09:00 committed by GitHub
parent 92d4aeafd5
commit 6ee51a36b3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 451 additions and 331 deletions

View 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 } } },

View 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
}

View 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",

View file

@ -2473,6 +2473,25 @@ def testfunc(args):
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

View file

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

View 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;

View file

@ -8096,11 +8096,51 @@
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();
@ -8127,18 +8167,54 @@
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;
}

View file

@ -7889,6 +7889,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
@ -7938,9 +7940,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_CLOSE(owner);
PyStackRef_XCLOSE(value);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
/* Skip 5 cache entries */

View 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)) {

View file

@ -1566,11 +1566,19 @@
}
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;
}