GH-142718: JIT: Fix crash due to incorrect caching on side exits when exiting jitted code. (GH-142762)

JIT: Fix crash due to incorrect caching on side exits when exiting jitted code.

* Make sure that stack is in correct state at side exits with TOS cached values
* Simplify choice of cached items for side exits
This commit is contained in:
Mark Shannon 2025-12-15 19:01:29 +00:00 committed by GitHub
parent 1a9cdaf63a
commit 27a2e49d18
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 980 additions and 328 deletions

View File

@ -906,212 +906,216 @@ extern "C" {
#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r02 1099
#define _LOAD_FAST_BORROW_LOAD_FAST_BORROW_r13 1100
#define _LOAD_FAST_CHECK_r01 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_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 _SPILL_OR_RELOAD_r01 1233
#define _SPILL_OR_RELOAD_r02 1234
#define _SPILL_OR_RELOAD_r03 1235
#define _SPILL_OR_RELOAD_r10 1236
#define _SPILL_OR_RELOAD_r12 1237
#define _SPILL_OR_RELOAD_r13 1238
#define _SPILL_OR_RELOAD_r20 1239
#define _SPILL_OR_RELOAD_r21 1240
#define _SPILL_OR_RELOAD_r23 1241
#define _SPILL_OR_RELOAD_r30 1242
#define _SPILL_OR_RELOAD_r31 1243
#define _SPILL_OR_RELOAD_r32 1244
#define _START_EXECUTOR_r00 1245
#define _STORE_ATTR_r20 1246
#define _STORE_ATTR_INSTANCE_VALUE_r20 1247
#define _STORE_ATTR_SLOT_r20 1248
#define _STORE_ATTR_WITH_HINT_r20 1249
#define _STORE_DEREF_r10 1250
#define _STORE_FAST_r10 1251
#define _STORE_FAST_0_r10 1252
#define _STORE_FAST_1_r10 1253
#define _STORE_FAST_2_r10 1254
#define _STORE_FAST_3_r10 1255
#define _STORE_FAST_4_r10 1256
#define _STORE_FAST_5_r10 1257
#define _STORE_FAST_6_r10 1258
#define _STORE_FAST_7_r10 1259
#define _STORE_FAST_LOAD_FAST_r11 1260
#define _STORE_FAST_STORE_FAST_r20 1261
#define _STORE_GLOBAL_r10 1262
#define _STORE_NAME_r10 1263
#define _STORE_SLICE_r30 1264
#define _STORE_SUBSCR_r30 1265
#define _STORE_SUBSCR_DICT_r31 1266
#define _STORE_SUBSCR_LIST_INT_r32 1267
#define _SWAP_r11 1268
#define _SWAP_2_r02 1269
#define _SWAP_2_r12 1270
#define _SWAP_2_r22 1271
#define _SWAP_2_r33 1272
#define _SWAP_3_r03 1273
#define _SWAP_3_r13 1274
#define _SWAP_3_r23 1275
#define _SWAP_3_r33 1276
#define _TIER2_RESUME_CHECK_r00 1277
#define _TIER2_RESUME_CHECK_r11 1278
#define _TIER2_RESUME_CHECK_r22 1279
#define _TIER2_RESUME_CHECK_r33 1280
#define _TO_BOOL_r11 1281
#define _TO_BOOL_BOOL_r01 1282
#define _TO_BOOL_BOOL_r11 1283
#define _TO_BOOL_BOOL_r22 1284
#define _TO_BOOL_BOOL_r33 1285
#define _TO_BOOL_INT_r11 1286
#define _TO_BOOL_LIST_r11 1287
#define _TO_BOOL_NONE_r01 1288
#define _TO_BOOL_NONE_r11 1289
#define _TO_BOOL_NONE_r22 1290
#define _TO_BOOL_NONE_r33 1291
#define _TO_BOOL_STR_r11 1292
#define _TRACE_RECORD_r00 1293
#define _UNARY_INVERT_r11 1294
#define _UNARY_NEGATIVE_r11 1295
#define _UNARY_NOT_r01 1296
#define _UNARY_NOT_r11 1297
#define _UNARY_NOT_r22 1298
#define _UNARY_NOT_r33 1299
#define _UNPACK_EX_r10 1300
#define _UNPACK_SEQUENCE_r10 1301
#define _UNPACK_SEQUENCE_LIST_r10 1302
#define _UNPACK_SEQUENCE_TUPLE_r10 1303
#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1304
#define _WITH_EXCEPT_START_r33 1305
#define _YIELD_VALUE_r11 1306
#define MAX_UOP_REGS_ID 1306
#define _LOAD_FAST_CHECK_r12 1102
#define _LOAD_FAST_CHECK_r23 1103
#define _LOAD_FAST_LOAD_FAST_r02 1104
#define _LOAD_FAST_LOAD_FAST_r13 1105
#define _LOAD_FROM_DICT_OR_DEREF_r11 1106
#define _LOAD_FROM_DICT_OR_GLOBALS_r11 1107
#define _LOAD_GLOBAL_r00 1108
#define _LOAD_GLOBAL_BUILTINS_r01 1109
#define _LOAD_GLOBAL_MODULE_r01 1110
#define _LOAD_LOCALS_r01 1111
#define _LOAD_LOCALS_r12 1112
#define _LOAD_LOCALS_r23 1113
#define _LOAD_NAME_r01 1114
#define _LOAD_SMALL_INT_r01 1115
#define _LOAD_SMALL_INT_r12 1116
#define _LOAD_SMALL_INT_r23 1117
#define _LOAD_SMALL_INT_0_r01 1118
#define _LOAD_SMALL_INT_0_r12 1119
#define _LOAD_SMALL_INT_0_r23 1120
#define _LOAD_SMALL_INT_1_r01 1121
#define _LOAD_SMALL_INT_1_r12 1122
#define _LOAD_SMALL_INT_1_r23 1123
#define _LOAD_SMALL_INT_2_r01 1124
#define _LOAD_SMALL_INT_2_r12 1125
#define _LOAD_SMALL_INT_2_r23 1126
#define _LOAD_SMALL_INT_3_r01 1127
#define _LOAD_SMALL_INT_3_r12 1128
#define _LOAD_SMALL_INT_3_r23 1129
#define _LOAD_SPECIAL_r00 1130
#define _LOAD_SUPER_ATTR_ATTR_r31 1131
#define _LOAD_SUPER_ATTR_METHOD_r32 1132
#define _MAKE_CALLARGS_A_TUPLE_r33 1133
#define _MAKE_CELL_r00 1134
#define _MAKE_FUNCTION_r11 1135
#define _MAKE_WARM_r00 1136
#define _MAKE_WARM_r11 1137
#define _MAKE_WARM_r22 1138
#define _MAKE_WARM_r33 1139
#define _MAP_ADD_r20 1140
#define _MATCH_CLASS_r31 1141
#define _MATCH_KEYS_r23 1142
#define _MATCH_MAPPING_r02 1143
#define _MATCH_MAPPING_r12 1144
#define _MATCH_MAPPING_r23 1145
#define _MATCH_SEQUENCE_r02 1146
#define _MATCH_SEQUENCE_r12 1147
#define _MATCH_SEQUENCE_r23 1148
#define _MAYBE_EXPAND_METHOD_r00 1149
#define _MAYBE_EXPAND_METHOD_KW_r11 1150
#define _MONITOR_CALL_r00 1151
#define _MONITOR_CALL_KW_r11 1152
#define _MONITOR_JUMP_BACKWARD_r00 1153
#define _MONITOR_JUMP_BACKWARD_r11 1154
#define _MONITOR_JUMP_BACKWARD_r22 1155
#define _MONITOR_JUMP_BACKWARD_r33 1156
#define _MONITOR_RESUME_r00 1157
#define _NOP_r00 1158
#define _NOP_r11 1159
#define _NOP_r22 1160
#define _NOP_r33 1161
#define _POP_CALL_r20 1162
#define _POP_CALL_LOAD_CONST_INLINE_BORROW_r21 1163
#define _POP_CALL_ONE_r30 1164
#define _POP_CALL_ONE_LOAD_CONST_INLINE_BORROW_r31 1165
#define _POP_CALL_TWO_r30 1166
#define _POP_CALL_TWO_LOAD_CONST_INLINE_BORROW_r31 1167
#define _POP_EXCEPT_r10 1168
#define _POP_ITER_r20 1169
#define _POP_JUMP_IF_FALSE_r00 1170
#define _POP_JUMP_IF_FALSE_r10 1171
#define _POP_JUMP_IF_FALSE_r21 1172
#define _POP_JUMP_IF_FALSE_r32 1173
#define _POP_JUMP_IF_TRUE_r00 1174
#define _POP_JUMP_IF_TRUE_r10 1175
#define _POP_JUMP_IF_TRUE_r21 1176
#define _POP_JUMP_IF_TRUE_r32 1177
#define _POP_TOP_r10 1178
#define _POP_TOP_FLOAT_r00 1179
#define _POP_TOP_FLOAT_r10 1180
#define _POP_TOP_FLOAT_r21 1181
#define _POP_TOP_FLOAT_r32 1182
#define _POP_TOP_INT_r00 1183
#define _POP_TOP_INT_r10 1184
#define _POP_TOP_INT_r21 1185
#define _POP_TOP_INT_r32 1186
#define _POP_TOP_LOAD_CONST_INLINE_r11 1187
#define _POP_TOP_LOAD_CONST_INLINE_BORROW_r11 1188
#define _POP_TOP_NOP_r00 1189
#define _POP_TOP_NOP_r10 1190
#define _POP_TOP_NOP_r21 1191
#define _POP_TOP_NOP_r32 1192
#define _POP_TOP_UNICODE_r00 1193
#define _POP_TOP_UNICODE_r10 1194
#define _POP_TOP_UNICODE_r21 1195
#define _POP_TOP_UNICODE_r32 1196
#define _POP_TWO_r20 1197
#define _POP_TWO_LOAD_CONST_INLINE_BORROW_r21 1198
#define _PUSH_EXC_INFO_r02 1199
#define _PUSH_EXC_INFO_r12 1200
#define _PUSH_EXC_INFO_r23 1201
#define _PUSH_FRAME_r10 1202
#define _PUSH_NULL_r01 1203
#define _PUSH_NULL_r12 1204
#define _PUSH_NULL_r23 1205
#define _PUSH_NULL_CONDITIONAL_r00 1206
#define _PY_FRAME_GENERAL_r01 1207
#define _PY_FRAME_KW_r11 1208
#define _QUICKEN_RESUME_r00 1209
#define _QUICKEN_RESUME_r11 1210
#define _QUICKEN_RESUME_r22 1211
#define _QUICKEN_RESUME_r33 1212
#define _REPLACE_WITH_TRUE_r11 1213
#define _RESUME_CHECK_r00 1214
#define _RESUME_CHECK_r11 1215
#define _RESUME_CHECK_r22 1216
#define _RESUME_CHECK_r33 1217
#define _RETURN_GENERATOR_r01 1218
#define _RETURN_VALUE_r11 1219
#define _SAVE_RETURN_OFFSET_r00 1220
#define _SAVE_RETURN_OFFSET_r11 1221
#define _SAVE_RETURN_OFFSET_r22 1222
#define _SAVE_RETURN_OFFSET_r33 1223
#define _SEND_r22 1224
#define _SEND_GEN_FRAME_r22 1225
#define _SETUP_ANNOTATIONS_r00 1226
#define _SET_ADD_r10 1227
#define _SET_FUNCTION_ATTRIBUTE_r01 1228
#define _SET_FUNCTION_ATTRIBUTE_r11 1229
#define _SET_FUNCTION_ATTRIBUTE_r21 1230
#define _SET_FUNCTION_ATTRIBUTE_r32 1231
#define _SET_IP_r00 1232
#define _SET_IP_r11 1233
#define _SET_IP_r22 1234
#define _SET_IP_r33 1235
#define _SET_UPDATE_r10 1236
#define _SPILL_OR_RELOAD_r01 1237
#define _SPILL_OR_RELOAD_r02 1238
#define _SPILL_OR_RELOAD_r03 1239
#define _SPILL_OR_RELOAD_r10 1240
#define _SPILL_OR_RELOAD_r12 1241
#define _SPILL_OR_RELOAD_r13 1242
#define _SPILL_OR_RELOAD_r20 1243
#define _SPILL_OR_RELOAD_r21 1244
#define _SPILL_OR_RELOAD_r23 1245
#define _SPILL_OR_RELOAD_r30 1246
#define _SPILL_OR_RELOAD_r31 1247
#define _SPILL_OR_RELOAD_r32 1248
#define _START_EXECUTOR_r00 1249
#define _STORE_ATTR_r20 1250
#define _STORE_ATTR_INSTANCE_VALUE_r20 1251
#define _STORE_ATTR_SLOT_r20 1252
#define _STORE_ATTR_WITH_HINT_r20 1253
#define _STORE_DEREF_r10 1254
#define _STORE_FAST_r10 1255
#define _STORE_FAST_0_r10 1256
#define _STORE_FAST_1_r10 1257
#define _STORE_FAST_2_r10 1258
#define _STORE_FAST_3_r10 1259
#define _STORE_FAST_4_r10 1260
#define _STORE_FAST_5_r10 1261
#define _STORE_FAST_6_r10 1262
#define _STORE_FAST_7_r10 1263
#define _STORE_FAST_LOAD_FAST_r11 1264
#define _STORE_FAST_STORE_FAST_r20 1265
#define _STORE_GLOBAL_r10 1266
#define _STORE_NAME_r10 1267
#define _STORE_SLICE_r30 1268
#define _STORE_SUBSCR_r30 1269
#define _STORE_SUBSCR_DICT_r31 1270
#define _STORE_SUBSCR_LIST_INT_r32 1271
#define _SWAP_r11 1272
#define _SWAP_2_r02 1273
#define _SWAP_2_r12 1274
#define _SWAP_2_r22 1275
#define _SWAP_2_r33 1276
#define _SWAP_3_r03 1277
#define _SWAP_3_r13 1278
#define _SWAP_3_r23 1279
#define _SWAP_3_r33 1280
#define _TIER2_RESUME_CHECK_r00 1281
#define _TIER2_RESUME_CHECK_r11 1282
#define _TIER2_RESUME_CHECK_r22 1283
#define _TIER2_RESUME_CHECK_r33 1284
#define _TO_BOOL_r11 1285
#define _TO_BOOL_BOOL_r01 1286
#define _TO_BOOL_BOOL_r11 1287
#define _TO_BOOL_BOOL_r22 1288
#define _TO_BOOL_BOOL_r33 1289
#define _TO_BOOL_INT_r11 1290
#define _TO_BOOL_LIST_r11 1291
#define _TO_BOOL_NONE_r01 1292
#define _TO_BOOL_NONE_r11 1293
#define _TO_BOOL_NONE_r22 1294
#define _TO_BOOL_NONE_r33 1295
#define _TO_BOOL_STR_r11 1296
#define _TRACE_RECORD_r00 1297
#define _UNARY_INVERT_r11 1298
#define _UNARY_NEGATIVE_r11 1299
#define _UNARY_NOT_r01 1300
#define _UNARY_NOT_r11 1301
#define _UNARY_NOT_r22 1302
#define _UNARY_NOT_r33 1303
#define _UNPACK_EX_r10 1304
#define _UNPACK_SEQUENCE_r10 1305
#define _UNPACK_SEQUENCE_LIST_r10 1306
#define _UNPACK_SEQUENCE_TUPLE_r10 1307
#define _UNPACK_SEQUENCE_TWO_TUPLE_r12 1308
#define _WITH_EXCEPT_START_r33 1309
#define _YIELD_VALUE_r11 1310
#define MAX_UOP_REGS_ID 1310
#ifdef __cplusplus
}

View File

@ -405,11 +405,11 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
},
},
[_LOAD_FAST_CHECK] = {
.best = { 0, 0, 0, 0 },
.best = { 0, 1, 2, 2 },
.entries = {
{ 1, 0, _LOAD_FAST_CHECK_r01 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 2, 1, _LOAD_FAST_CHECK_r12 },
{ 3, 2, _LOAD_FAST_CHECK_r23 },
{ -1, -1, -1 },
},
},
@ -813,7 +813,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _UNARY_NEGATIVE_r11 },
{ 1, 1, _UNARY_NEGATIVE_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -831,7 +831,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _TO_BOOL_r11 },
{ 1, 1, _TO_BOOL_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -939,7 +939,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _UNARY_INVERT_r11 },
{ 1, 1, _UNARY_INVERT_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1093,7 +1093,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 0, 0, _BINARY_OP_INPLACE_ADD_UNICODE_r20 },
{ 0, 2, _BINARY_OP_INPLACE_ADD_UNICODE_r20 },
{ -1, -1, -1 },
},
},
@ -1102,7 +1102,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 2, 0, _GUARD_BINARY_OP_EXTEND_r22 },
{ 2, 2, _GUARD_BINARY_OP_EXTEND_r22 },
{ -1, -1, -1 },
},
},
@ -1111,7 +1111,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _BINARY_OP_EXTEND_r21 },
{ 1, 2, _BINARY_OP_EXTEND_r21 },
{ -1, -1, -1 },
},
},
@ -1121,7 +1121,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _BINARY_SLICE_r31 },
{ 1, 3, _BINARY_SLICE_r31 },
},
},
[_STORE_SLICE] = {
@ -1130,7 +1130,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 0, 0, _STORE_SLICE_r30 },
{ 0, 3, _STORE_SLICE_r30 },
},
},
[_BINARY_OP_SUBSCR_LIST_INT] = {
@ -1138,7 +1138,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _BINARY_OP_SUBSCR_LIST_INT_r21 },
{ 1, 2, _BINARY_OP_SUBSCR_LIST_INT_r21 },
{ -1, -1, -1 },
},
},
@ -1147,7 +1147,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _BINARY_OP_SUBSCR_LIST_SLICE_r21 },
{ 1, 2, _BINARY_OP_SUBSCR_LIST_SLICE_r21 },
{ -1, -1, -1 },
},
},
@ -1210,7 +1210,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _BINARY_OP_SUBSCR_DICT_r21 },
{ 1, 2, _BINARY_OP_SUBSCR_DICT_r21 },
{ -1, -1, -1 },
},
},
@ -1245,7 +1245,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _SET_ADD_r10 },
{ 0, 1, _SET_ADD_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1256,7 +1256,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 0, 0, _STORE_SUBSCR_r30 },
{ 0, 3, _STORE_SUBSCR_r30 },
},
},
[_STORE_SUBSCR_LIST_INT] = {
@ -1274,7 +1274,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _STORE_SUBSCR_DICT_r31 },
{ 1, 3, _STORE_SUBSCR_DICT_r31 },
},
},
[_DELETE_SUBSCR] = {
@ -1282,7 +1282,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 0, 0, _DELETE_SUBSCR_r20 },
{ 0, 2, _DELETE_SUBSCR_r20 },
{ -1, -1, -1 },
},
},
@ -1290,7 +1290,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _CALL_INTRINSIC_1_r11 },
{ 1, 1, _CALL_INTRINSIC_1_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1300,7 +1300,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _CALL_INTRINSIC_2_r21 },
{ 1, 2, _CALL_INTRINSIC_2_r21 },
{ -1, -1, -1 },
},
},
@ -1308,7 +1308,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _RETURN_VALUE_r11 },
{ 1, 1, _RETURN_VALUE_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1317,7 +1317,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _GET_AITER_r11 },
{ 1, 1, _GET_AITER_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1326,7 +1326,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 2, 0, _GET_ANEXT_r12 },
{ 2, 1, _GET_ANEXT_r12 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1335,7 +1335,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _GET_AWAITABLE_r11 },
{ 1, 1, _GET_AWAITABLE_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1362,7 +1362,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _POP_EXCEPT_r10 },
{ 0, 1, _POP_EXCEPT_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1389,7 +1389,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _STORE_NAME_r10 },
{ 0, 1, _STORE_NAME_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1407,7 +1407,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _UNPACK_SEQUENCE_r10 },
{ 0, 1, _UNPACK_SEQUENCE_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1443,7 +1443,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _UNPACK_EX_r10 },
{ 0, 1, _UNPACK_EX_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1453,7 +1453,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 0, 0, _STORE_ATTR_r20 },
{ 0, 2, _STORE_ATTR_r20 },
{ -1, -1, -1 },
},
},
@ -1461,7 +1461,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _DELETE_ATTR_r10 },
{ 0, 1, _DELETE_ATTR_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1470,7 +1470,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _STORE_GLOBAL_r10 },
{ 0, 1, _STORE_GLOBAL_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1485,11 +1485,11 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
},
},
[_LOAD_LOCALS] = {
.best = { 0, 0, 0, 0 },
.best = { 0, 1, 2, 2 },
.entries = {
{ 1, 0, _LOAD_LOCALS_r01 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 2, 1, _LOAD_LOCALS_r12 },
{ 3, 2, _LOAD_LOCALS_r23 },
{ -1, -1, -1 },
},
},
@ -1578,7 +1578,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _LOAD_FROM_DICT_OR_DEREF_r11 },
{ 1, 1, _LOAD_FROM_DICT_OR_DEREF_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1596,7 +1596,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _STORE_DEREF_r10 },
{ 0, 1, _STORE_DEREF_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1633,7 +1633,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _BUILD_TEMPLATE_r21 },
{ 1, 2, _BUILD_TEMPLATE_r21 },
{ -1, -1, -1 },
},
},
@ -1659,7 +1659,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _LIST_EXTEND_r10 },
{ 0, 1, _LIST_EXTEND_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1668,7 +1668,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _SET_UPDATE_r10 },
{ 0, 1, _SET_UPDATE_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1704,7 +1704,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _DICT_UPDATE_r10 },
{ 0, 1, _DICT_UPDATE_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1713,7 +1713,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _DICT_MERGE_r10 },
{ 0, 1, _DICT_MERGE_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1723,7 +1723,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 0, 0, _MAP_ADD_r20 },
{ 0, 2, _MAP_ADD_r20 },
{ -1, -1, -1 },
},
},
@ -1733,7 +1733,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _LOAD_SUPER_ATTR_ATTR_r31 },
{ 1, 3, _LOAD_SUPER_ATTR_ATTR_r31 },
},
},
[_LOAD_SUPER_ATTR_METHOD] = {
@ -1742,14 +1742,14 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 2, 0, _LOAD_SUPER_ATTR_METHOD_r32 },
{ 2, 3, _LOAD_SUPER_ATTR_METHOD_r32 },
},
},
[_LOAD_ATTR] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _LOAD_ATTR_r10 },
{ 0, 1, _LOAD_ATTR_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -1867,7 +1867,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 0, 0, _STORE_ATTR_WITH_HINT_r20 },
{ 0, 2, _STORE_ATTR_WITH_HINT_r20 },
{ -1, -1, -1 },
},
},
@ -1885,7 +1885,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _COMPARE_OP_r21 },
{ 1, 2, _COMPARE_OP_r21 },
{ -1, -1, -1 },
},
},
@ -1930,7 +1930,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _CONTAINS_OP_r21 },
{ 1, 2, _CONTAINS_OP_r21 },
{ -1, -1, -1 },
},
},
@ -1948,7 +1948,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _CONTAINS_OP_SET_r21 },
{ 1, 2, _CONTAINS_OP_SET_r21 },
{ -1, -1, -1 },
},
},
@ -1957,7 +1957,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _CONTAINS_OP_DICT_r21 },
{ 1, 2, _CONTAINS_OP_DICT_r21 },
{ -1, -1, -1 },
},
},
@ -1966,7 +1966,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 2, 0, _CHECK_EG_MATCH_r22 },
{ 2, 2, _CHECK_EG_MATCH_r22 },
{ -1, -1, -1 },
},
},
@ -1975,7 +1975,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 2, 0, _CHECK_EXC_MATCH_r22 },
{ 2, 2, _CHECK_EXC_MATCH_r22 },
{ -1, -1, -1 },
},
},
@ -1984,7 +1984,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _IMPORT_NAME_r21 },
{ 1, 2, _IMPORT_NAME_r21 },
{ -1, -1, -1 },
},
},
@ -1992,7 +1992,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 2, 0, _IMPORT_FROM_r12 },
{ 2, 1, _IMPORT_FROM_r12 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2010,7 +2010,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 2, 0, _GET_LEN_r12 },
{ 2, 1, _GET_LEN_r12 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2021,7 +2021,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _MATCH_CLASS_r31 },
{ 1, 3, _MATCH_CLASS_r31 },
},
},
[_MATCH_MAPPING] = {
@ -2047,7 +2047,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 3, 0, _MATCH_KEYS_r23 },
{ 3, 2, _MATCH_KEYS_r23 },
{ -1, -1, -1 },
},
},
@ -2055,7 +2055,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 2, 0, _GET_ITER_r12 },
{ 2, 1, _GET_ITER_r12 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2064,7 +2064,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _GET_YIELD_FROM_ITER_r11 },
{ 1, 1, _GET_YIELD_FROM_ITER_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2074,7 +2074,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 3, 0, _FOR_ITER_TIER_TWO_r23 },
{ 3, 2, _FOR_ITER_TIER_TWO_r23 },
{ -1, -1, -1 },
},
},
@ -2101,7 +2101,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 3, 0, _ITER_NEXT_LIST_TIER_TWO_r23 },
{ 3, 2, _ITER_NEXT_LIST_TIER_TWO_r23 },
{ -1, -1, -1 },
},
},
@ -2192,7 +2192,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 3, 0, _WITH_EXCEPT_START_r33 },
{ 3, 3, _WITH_EXCEPT_START_r33 },
},
},
[_PUSH_EXC_INFO] = {
@ -2288,7 +2288,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
[_PY_FRAME_GENERAL] = {
.best = { 0, 0, 0, 0 },
.entries = {
{ 1, 0, _PY_FRAME_GENERAL_r01 },
{ 1, 1, _PY_FRAME_GENERAL_r01 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
@ -2525,7 +2525,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 2, 0, _CALL_STR_1_r32 },
{ 2, 3, _CALL_STR_1_r32 },
},
},
[_GUARD_CALLABLE_TUPLE_1] = {
@ -2543,7 +2543,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 2, 0, _CALL_TUPLE_1_r32 },
{ 2, 3, _CALL_TUPLE_1_r32 },
},
},
[_CHECK_AND_ALLOCATE_OBJECT] = {
@ -2558,7 +2558,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
[_CREATE_INIT_FRAME] = {
.best = { 0, 0, 0, 0 },
.entries = {
{ 1, 0, _CREATE_INIT_FRAME_r01 },
{ 1, 1, _CREATE_INIT_FRAME_r01 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
@ -2568,7 +2568,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 0, 0, _EXIT_INIT_CHECK_r10 },
{ 0, 1, _EXIT_INIT_CHECK_r10 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2624,7 +2624,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 3, 0, _CALL_LEN_r33 },
{ 3, 3, _CALL_LEN_r33 },
},
},
[_GUARD_CALLABLE_ISINSTANCE] = {
@ -2642,7 +2642,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _CALL_ISINSTANCE_r31 },
{ 1, 3, _CALL_ISINSTANCE_r31 },
},
},
[_GUARD_CALLABLE_LIST_APPEND] = {
@ -2712,7 +2712,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _PY_FRAME_KW_r11 },
{ 1, 1, _PY_FRAME_KW_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2757,7 +2757,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _CALL_KW_NON_PY_r11 },
{ 1, 1, _CALL_KW_NON_PY_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2768,14 +2768,14 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 3, 0, _MAKE_CALLARGS_A_TUPLE_r33 },
{ 3, 3, _MAKE_CALLARGS_A_TUPLE_r33 },
},
},
[_MAKE_FUNCTION] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _MAKE_FUNCTION_r11 },
{ 1, 1, _MAKE_FUNCTION_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2811,7 +2811,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _CONVERT_VALUE_r11 },
{ 1, 1, _CONVERT_VALUE_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2820,7 +2820,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.best = { 1, 1, 1, 1 },
.entries = {
{ -1, -1, -1 },
{ 1, 0, _FORMAT_SIMPLE_r11 },
{ 1, 1, _FORMAT_SIMPLE_r11 },
{ -1, -1, -1 },
{ -1, -1, -1 },
},
@ -2830,7 +2830,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _FORMAT_WITH_SPEC_r21 },
{ 1, 2, _FORMAT_WITH_SPEC_r21 },
{ -1, -1, -1 },
},
},
@ -2875,7 +2875,7 @@ const _PyUopCachingInfo _PyUop_Caching[MAX_UOP_ID+1] = {
.entries = {
{ -1, -1, -1 },
{ -1, -1, -1 },
{ 1, 0, _BINARY_OP_r21 },
{ 1, 2, _BINARY_OP_r21 },
{ -1, -1, -1 },
},
},
@ -3253,6 +3253,8 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {
[_RESUME_CHECK_r22] = _RESUME_CHECK,
[_RESUME_CHECK_r33] = _RESUME_CHECK,
[_LOAD_FAST_CHECK_r01] = _LOAD_FAST_CHECK,
[_LOAD_FAST_CHECK_r12] = _LOAD_FAST_CHECK,
[_LOAD_FAST_CHECK_r23] = _LOAD_FAST_CHECK,
[_LOAD_FAST_0_r01] = _LOAD_FAST_0,
[_LOAD_FAST_0_r12] = _LOAD_FAST_0,
[_LOAD_FAST_0_r23] = _LOAD_FAST_0,
@ -3526,6 +3528,8 @@ const uint16_t _PyUop_Uncached[MAX_UOP_REGS_ID+1] = {
[_STORE_GLOBAL_r10] = _STORE_GLOBAL,
[_DELETE_GLOBAL_r00] = _DELETE_GLOBAL,
[_LOAD_LOCALS_r01] = _LOAD_LOCALS,
[_LOAD_LOCALS_r12] = _LOAD_LOCALS,
[_LOAD_LOCALS_r23] = _LOAD_LOCALS,
[_LOAD_NAME_r01] = _LOAD_NAME,
[_LOAD_GLOBAL_r00] = _LOAD_GLOBAL,
[_PUSH_NULL_CONDITIONAL_r00] = _PUSH_NULL_CONDITIONAL,
@ -4653,6 +4657,8 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
[_LOAD_FAST_BORROW_7_r23] = "_LOAD_FAST_BORROW_7_r23",
[_LOAD_FAST_CHECK] = "_LOAD_FAST_CHECK",
[_LOAD_FAST_CHECK_r01] = "_LOAD_FAST_CHECK_r01",
[_LOAD_FAST_CHECK_r12] = "_LOAD_FAST_CHECK_r12",
[_LOAD_FAST_CHECK_r23] = "_LOAD_FAST_CHECK_r23",
[_LOAD_FROM_DICT_OR_DEREF] = "_LOAD_FROM_DICT_OR_DEREF",
[_LOAD_FROM_DICT_OR_DEREF_r11] = "_LOAD_FROM_DICT_OR_DEREF_r11",
[_LOAD_GLOBAL] = "_LOAD_GLOBAL",
@ -4663,6 +4669,8 @@ const char *const _PyOpcode_uop_name[MAX_UOP_REGS_ID+1] = {
[_LOAD_GLOBAL_MODULE_r01] = "_LOAD_GLOBAL_MODULE_r01",
[_LOAD_LOCALS] = "_LOAD_LOCALS",
[_LOAD_LOCALS_r01] = "_LOAD_LOCALS_r01",
[_LOAD_LOCALS_r12] = "_LOAD_LOCALS_r12",
[_LOAD_LOCALS_r23] = "_LOAD_LOCALS_r23",
[_LOAD_NAME] = "_LOAD_NAME",
[_LOAD_NAME_r01] = "_LOAD_NAME_r01",
[_LOAD_SMALL_INT] = "_LOAD_SMALL_INT",

View File

@ -2812,6 +2812,28 @@ class TestUopsOptimization(unittest.TestCase):
pool.submit(write, (1,))
"""))
def test_handling_of_tos_cache_with_side_exits(self):
# https://github.com/python/cpython/issues/142718
class EvilAttr:
def __init__(self, d):
self.d = d
def __del__(self):
try:
del self.d['attr']
except Exception:
pass
class Obj:
pass
obj = Obj()
obj.__dict__ = {}
for _ in range(TIER2_THRESHOLD+1):
obj.attr = EvilAttr(obj.__dict__)
def global_identity(x):
return x

View File

@ -0,0 +1 @@
JIT: Fix segfault caused by not flushing the stack to memory at side exits.

File diff suppressed because it is too large Load Diff

View File

@ -1372,11 +1372,6 @@ def get_uop_cache_depths(uop: Uop) -> Iterator[tuple[int, int, int]]:
if uop.name == "_ERROR_POP_N":
yield 0, 0, 0
return
non_decref_escape = False
for call in uop.properties.escaping_calls.values():
if "DECREF" in call.call.text or "CLOSE" in call.call.text:
continue
non_decref_escape = True
ideal_inputs = 0
has_array = False
for item in reversed(uop.stack.inputs):
@ -1394,9 +1389,6 @@ def get_uop_cache_depths(uop: Uop) -> Iterator[tuple[int, int, int]]:
ideal_inputs = MAX_CACHED_REGISTER
if ideal_outputs > MAX_CACHED_REGISTER:
ideal_outputs = MAX_CACHED_REGISTER
if non_decref_escape:
yield ideal_inputs, ideal_outputs, 0
return
at_end = uop.properties.sync_sp or uop.properties.side_exit_at_end
exit_depth = ideal_outputs if at_end else ideal_inputs
if uop.properties.escapes or uop.properties.sync_sp or has_array or is_large(uop):

View File

@ -95,7 +95,9 @@ class Tier2Emitter(Emitter):
next(tkn_iter) # Semi colon
self.emit(") {\n")
self.emit("UOP_STAT_INC(uopcode, miss);\n")
self.emit(f"SET_CURRENT_CACHED_VALUES({self.exit_cache_depth});\n")
storage = storage.copy()
self.cache_items(storage.stack, self.exit_cache_depth, False)
storage.stack.flush(self.out)
self.emit("JUMP_TO_JUMP_TARGET();\n")
self.emit("}\n")
return not always_true(first_tkn)
@ -151,7 +153,7 @@ class Tier2Emitter(Emitter):
inst: Instruction | None,
) -> bool:
assert self.exit_cache_depth == 0, uop.name
cache_items(self, storage.stack, self.exit_cache_depth, False)
self.cache_items(storage.stack, self.exit_cache_depth, False)
storage.flush(self.out)
self.out.emit(tkn)
lparen = next(tkn_iter)
@ -181,31 +183,31 @@ class Tier2Emitter(Emitter):
self.emit("UOP_STAT_INC(uopcode, miss);\n")
storage = storage.copy()
storage.clear_inputs("in AT_END_EXIT_IF")
cache_items(self, storage.stack, self.exit_cache_depth, False)
self.cache_items(storage.stack, self.exit_cache_depth, False)
storage.flush(self.out)
self.emit("JUMP_TO_JUMP_TARGET();\n")
self.emit("}\n")
return not always_true(first_tkn)
def cache_items(self, stack: Stack, cached_items: int, zero_regs: bool) -> None:
self.out.start_line()
i = cached_items
while i > 0:
self.out.start_line()
item = StackItem(f"_tos_cache{i-1}", "", False, True)
stack.pop(item, self.out)
i -= 1
if zero_regs:
# TO DO -- For compilers that support it,
# replace this with a "clobber" to tell
# the compiler that these values are unused
# without having to emit any code.
for i in range(cached_items, MAX_CACHED_REGISTER):
self.out.emit(f"_tos_cache{i} = PyStackRef_ZERO_BITS;\n")
self.emit(f"SET_CURRENT_CACHED_VALUES({cached_items});\n")
def cache_items(emitter: Emitter, stack: Stack, cached_items: int, zero_regs: bool) -> None:
emitter.out.start_line()
i = cached_items
while i > 0:
emitter.out.start_line()
item = StackItem(f"_tos_cache{i-1}", "", False, True)
stack.pop(item, emitter.out)
i -= 1
if zero_regs:
# TO DO -- For compilers that support it,
# replace this with a "clobber" to tell
# the compiler that these values are unused
# without having to emit any code.
for i in range(cached_items, MAX_CACHED_REGISTER):
emitter.out.emit(f"_tos_cache{i} = PyStackRef_ZERO_BITS;\n")
emitter.emit(f"SET_CURRENT_CACHED_VALUES({cached_items});\n")
def write_uop(uop: Uop, emitter: Emitter, stack: Stack, offset_strs: dict[str, tuple[str, str]], cached_items: int = 0) -> tuple[bool, Stack]:
def write_uop(uop: Uop, emitter: Tier2Emitter, stack: Stack, offset_strs: dict[str, tuple[str, str]], cached_items: int = 0) -> tuple[bool, Stack]:
locals: dict[str, Local] = {}
zero_regs = is_large(uop) or uop.properties.escapes
try:
@ -233,7 +235,7 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack, offset_strs: dict[str, t
reachable, storage = emitter.emit_tokens(uop, storage, None, False)
if reachable:
storage.stack._print(emitter.out)
cache_items(emitter, storage.stack, cached_items, zero_regs)
emitter.cache_items(storage.stack, cached_items, zero_regs)
storage.flush(emitter.out)
if name_offset_pair:
emitter.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n")