// This file is generated by Tools/cases_generator/optimizer_generator.py
// from:
//   Python/optimizer_bytecodes.c
// Do not edit!

        case _NOP: {
            break;
        }

        case _RESUME_CHECK: {
            break;
        }

        /* _INSTRUMENTED_RESUME is not a viable micro-op for tier 2 */

        case _LOAD_FAST_CHECK: {
            _Py_UopsSymbol *value;
            value = GETLOCAL(oparg);
            // We guarantee this will error - just bail and don't optimize it.
            if (sym_is_null(value)) {
                goto out_of_space;
            }
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST: {
            _Py_UopsSymbol *value;
            value = GETLOCAL(oparg);
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FAST_AND_CLEAR: {
            _Py_UopsSymbol *value;
            value = GETLOCAL(oparg);
            _Py_UopsSymbol *temp;
            OUT_OF_SPACE_IF_NULL(temp = sym_new_null(ctx));
            GETLOCAL(oparg) = temp;
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_CONST: {
            _Py_UopsSymbol *value;
            // There should be no LOAD_CONST. It should be all
            // replaced by peephole_opt.
            Py_UNREACHABLE();
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _STORE_FAST: {
            _Py_UopsSymbol *value;
            value = stack_pointer[-1];
            GETLOCAL(oparg) = value;
            stack_pointer += -1;
            break;
        }

        case _POP_TOP: {
            stack_pointer += -1;
            break;
        }

        case _PUSH_NULL: {
            _Py_UopsSymbol *res;
            res = sym_new_null(ctx);
            if (res == NULL) {
                goto out_of_space;
            };
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _END_SEND: {
            _Py_UopsSymbol *value;
            value = sym_new_unknown(ctx);
            if (value == NULL) goto out_of_space;
            stack_pointer[-2] = value;
            stack_pointer += -1;
            break;
        }

        case _UNARY_NEGATIVE: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-1] = res;
            break;
        }

        case _UNARY_NOT: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL: {
            _Py_UopsSymbol *value;
            _Py_UopsSymbol *res;
            value = stack_pointer[-1];
            if (optimize_to_bool(this_instr, ctx, value, &res)) {
                OUT_OF_SPACE_IF_NULL(res);
            }
            else {
                res = sym_new_type(ctx, &PyBool_Type);
                OUT_OF_SPACE_IF_NULL(res);
            }
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_BOOL: {
            _Py_UopsSymbol *value;
            _Py_UopsSymbol *res;
            value = stack_pointer[-1];
            if (optimize_to_bool(this_instr, ctx, value, &res)) {
                OUT_OF_SPACE_IF_NULL(res);
            }
            else {
                if(!sym_set_type(value, &PyBool_Type)) {
                    goto hit_bottom;
                }
                res = value;
            }
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_INT: {
            _Py_UopsSymbol *value;
            _Py_UopsSymbol *res;
            value = stack_pointer[-1];
            if (optimize_to_bool(this_instr, ctx, value, &res)) {
                OUT_OF_SPACE_IF_NULL(res);
            }
            else {
                if(!sym_set_type(value, &PyLong_Type)) {
                    goto hit_bottom;
                }
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
            }
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_LIST: {
            _Py_UopsSymbol *value;
            _Py_UopsSymbol *res;
            value = stack_pointer[-1];
            if (optimize_to_bool(this_instr, ctx, value, &res)) {
                OUT_OF_SPACE_IF_NULL(res);
            }
            else {
                if(!sym_set_type(value, &PyList_Type)) {
                    goto hit_bottom;
                }
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
            }
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_NONE: {
            _Py_UopsSymbol *value;
            _Py_UopsSymbol *res;
            value = stack_pointer[-1];
            if (optimize_to_bool(this_instr, ctx, value, &res)) {
                OUT_OF_SPACE_IF_NULL(res);
            }
            else {
                if (!sym_set_const(value, Py_None)) {
                    goto hit_bottom;
                }
                OUT_OF_SPACE_IF_NULL(res = sym_new_const(ctx, Py_False));
            }
            stack_pointer[-1] = res;
            break;
        }

        case _TO_BOOL_STR: {
            _Py_UopsSymbol *value;
            _Py_UopsSymbol *res;
            value = stack_pointer[-1];
            if (optimize_to_bool(this_instr, ctx, value, &res)) {
                OUT_OF_SPACE_IF_NULL(res);
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
                if(!sym_set_type(value, &PyUnicode_Type)) {
                    goto hit_bottom;
                }
            }
            stack_pointer[-1] = res;
            break;
        }

        case _REPLACE_WITH_TRUE: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-1] = res;
            break;
        }

        case _UNARY_INVERT: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-1] = res;
            break;
        }

        case _GUARD_BOTH_INT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_matches_type(left, &PyLong_Type) &&
                sym_matches_type(right, &PyLong_Type)) {
                REPLACE_OP(this_instr, _NOP, 0, 0);
            }
            if (!sym_set_type(left, &PyLong_Type)) {
                goto hit_bottom;
            }
            if (!sym_set_type(right, &PyLong_Type)) {
                goto hit_bottom;
            }
            break;
        }

        case _BINARY_OP_MULTIPLY_INT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_is_const(left) && sym_is_const(right) &&
                sym_matches_type(left, &PyLong_Type) && sym_matches_type(right, &PyLong_Type))
            {
                assert(PyLong_CheckExact(sym_get_const(left)));
                assert(PyLong_CheckExact(sym_get_const(right)));
                PyObject *temp = _PyLong_Multiply((PyLongObject *)sym_get_const(left),
                    (PyLongObject *)sym_get_const(right));
                if (temp == NULL) {
                    goto error;
                }
                res = sym_new_const(ctx, temp);
                Py_DECREF(temp);
                OUT_OF_SPACE_IF_NULL(res);
                // TODO gh-115506:
                // replace opcode with constant propagated one and add tests!
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyLong_Type));
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_OP_ADD_INT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_is_const(left) && sym_is_const(right) &&
                sym_matches_type(left, &PyLong_Type) && sym_matches_type(right, &PyLong_Type))
            {
                assert(PyLong_CheckExact(sym_get_const(left)));
                assert(PyLong_CheckExact(sym_get_const(right)));
                PyObject *temp = _PyLong_Add((PyLongObject *)sym_get_const(left),
                    (PyLongObject *)sym_get_const(right));
                if (temp == NULL) {
                    goto error;
                }
                res = sym_new_const(ctx, temp);
                Py_DECREF(temp);
                OUT_OF_SPACE_IF_NULL(res);
                // TODO gh-115506:
                // replace opcode with constant propagated one and add tests!
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyLong_Type));
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_OP_SUBTRACT_INT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_is_const(left) && sym_is_const(right) &&
                sym_matches_type(left, &PyLong_Type) && sym_matches_type(right, &PyLong_Type))
            {
                assert(PyLong_CheckExact(sym_get_const(left)));
                assert(PyLong_CheckExact(sym_get_const(right)));
                PyObject *temp = _PyLong_Subtract((PyLongObject *)sym_get_const(left),
                    (PyLongObject *)sym_get_const(right));
                if (temp == NULL) {
                    goto error;
                }
                res = sym_new_const(ctx, temp);
                Py_DECREF(temp);
                OUT_OF_SPACE_IF_NULL(res);
                // TODO gh-115506:
                // replace opcode with constant propagated one and add tests!
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyLong_Type));
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _GUARD_BOTH_FLOAT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_matches_type(left, &PyFloat_Type) &&
                sym_matches_type(right, &PyFloat_Type)) {
                REPLACE_OP(this_instr, _NOP, 0 ,0);
            }
            if (!sym_set_type(left, &PyFloat_Type)) {
                goto hit_bottom;
            }
            if (!sym_set_type(right, &PyFloat_Type)) {
                goto hit_bottom;
            }
            break;
        }

        case _BINARY_OP_MULTIPLY_FLOAT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_is_const(left) && sym_is_const(right) &&
                sym_matches_type(left, &PyFloat_Type) && sym_matches_type(right, &PyFloat_Type))
            {
                assert(PyFloat_CheckExact(sym_get_const(left)));
                assert(PyFloat_CheckExact(sym_get_const(right)));
                PyObject *temp = PyFloat_FromDouble(
                    PyFloat_AS_DOUBLE(sym_get_const(left)) *
                    PyFloat_AS_DOUBLE(sym_get_const(right)));
                if (temp == NULL) {
                    goto error;
                }
                res = sym_new_const(ctx, temp);
                Py_DECREF(temp);
                OUT_OF_SPACE_IF_NULL(res);
                // TODO gh-115506:
                // replace opcode with constant propagated one and update tests!
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyFloat_Type));
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_OP_ADD_FLOAT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_is_const(left) && sym_is_const(right) &&
                sym_matches_type(left, &PyFloat_Type) && sym_matches_type(right, &PyFloat_Type))
            {
                assert(PyFloat_CheckExact(sym_get_const(left)));
                assert(PyFloat_CheckExact(sym_get_const(right)));
                PyObject *temp = PyFloat_FromDouble(
                    PyFloat_AS_DOUBLE(sym_get_const(left)) +
                    PyFloat_AS_DOUBLE(sym_get_const(right)));
                if (temp == NULL) {
                    goto error;
                }
                res = sym_new_const(ctx, temp);
                Py_DECREF(temp);
                OUT_OF_SPACE_IF_NULL(res);
                // TODO gh-115506:
                // replace opcode with constant propagated one and update tests!
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyFloat_Type));
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_OP_SUBTRACT_FLOAT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_is_const(left) && sym_is_const(right) &&
                sym_matches_type(left, &PyFloat_Type) && sym_matches_type(right, &PyFloat_Type))
            {
                assert(PyFloat_CheckExact(sym_get_const(left)));
                assert(PyFloat_CheckExact(sym_get_const(right)));
                PyObject *temp = PyFloat_FromDouble(
                    PyFloat_AS_DOUBLE(sym_get_const(left)) -
                    PyFloat_AS_DOUBLE(sym_get_const(right)));
                if (temp == NULL) {
                    goto error;
                }
                res = sym_new_const(ctx, temp);
                Py_DECREF(temp);
                OUT_OF_SPACE_IF_NULL(res);
                // TODO gh-115506:
                // replace opcode with constant propagated one and update tests!
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyFloat_Type));
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _GUARD_BOTH_UNICODE: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_matches_type(left, &PyUnicode_Type) &&
                sym_matches_type(right, &PyUnicode_Type)) {
                REPLACE_OP(this_instr, _NOP, 0 ,0);
            }
            if (!sym_set_type(left, &PyUnicode_Type)) {
                goto hit_bottom;
            }
            if (!sym_set_type(right, &PyUnicode_Type)) {
                goto hit_bottom;
            }
            break;
        }

        case _BINARY_OP_ADD_UNICODE: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            if (sym_is_const(left) && sym_is_const(right) &&
                sym_matches_type(left, &PyUnicode_Type) && sym_matches_type(right, &PyUnicode_Type)) {
                PyObject *temp = PyUnicode_Concat(sym_get_const(left), sym_get_const(right));
                if (temp == NULL) {
                    goto error;
                }
                res = sym_new_const(ctx, temp);
                Py_DECREF(temp);
                OUT_OF_SPACE_IF_NULL(res);
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyUnicode_Type));
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SUBSCR: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SLICE: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-3] = res;
            stack_pointer += -2;
            break;
        }

        case _STORE_SLICE: {
            stack_pointer += -4;
            break;
        }

        case _BINARY_SUBSCR_LIST_INT: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SUBSCR_STR_INT: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SUBSCR_TUPLE_INT: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _BINARY_SUBSCR_DICT: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        /* _BINARY_SUBSCR_GETITEM is not a viable micro-op for tier 2 */

        case _LIST_APPEND: {
            stack_pointer += -1;
            break;
        }

        case _SET_ADD: {
            stack_pointer += -1;
            break;
        }

        case _STORE_SUBSCR: {
            stack_pointer += -3;
            break;
        }

        case _STORE_SUBSCR_LIST_INT: {
            stack_pointer += -3;
            break;
        }

        case _STORE_SUBSCR_DICT: {
            stack_pointer += -3;
            break;
        }

        case _DELETE_SUBSCR: {
            stack_pointer += -2;
            break;
        }

        case _CALL_INTRINSIC_1: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-1] = res;
            break;
        }

        case _CALL_INTRINSIC_2: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _POP_FRAME: {
            _Py_UopsSymbol *retval;
            _Py_UopsSymbol *res;
            retval = stack_pointer[-1];
            stack_pointer += -1;
            ctx->frame->stack_pointer = stack_pointer;
            frame_pop(ctx);
            stack_pointer = ctx->frame->stack_pointer;
            res = retval;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        /* _INSTRUMENTED_RETURN_VALUE is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_RETURN_CONST is not a viable micro-op for tier 2 */

        case _GET_AITER: {
            _Py_UopsSymbol *iter;
            iter = sym_new_unknown(ctx);
            if (iter == NULL) goto out_of_space;
            stack_pointer[-1] = iter;
            break;
        }

        case _GET_ANEXT: {
            _Py_UopsSymbol *awaitable;
            awaitable = sym_new_unknown(ctx);
            if (awaitable == NULL) goto out_of_space;
            stack_pointer[0] = awaitable;
            stack_pointer += 1;
            break;
        }

        case _GET_AWAITABLE: {
            _Py_UopsSymbol *iter;
            iter = sym_new_unknown(ctx);
            if (iter == NULL) goto out_of_space;
            stack_pointer[-1] = iter;
            break;
        }

        /* _SEND is not a viable micro-op for tier 2 */

        /* _SEND_GEN is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_YIELD_VALUE is not a viable micro-op for tier 2 */

        case _POP_EXCEPT: {
            stack_pointer += -1;
            break;
        }

        case _LOAD_ASSERTION_ERROR: {
            _Py_UopsSymbol *value;
            value = sym_new_unknown(ctx);
            if (value == NULL) goto out_of_space;
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_BUILD_CLASS: {
            _Py_UopsSymbol *bc;
            bc = sym_new_unknown(ctx);
            if (bc == NULL) goto out_of_space;
            stack_pointer[0] = bc;
            stack_pointer += 1;
            break;
        }

        case _STORE_NAME: {
            stack_pointer += -1;
            break;
        }

        case _DELETE_NAME: {
            break;
        }

        case _UNPACK_SEQUENCE: {
            _Py_UopsSymbol *seq;
            _Py_UopsSymbol **values;
            seq = stack_pointer[-1];
            values = &stack_pointer[-1];
            /* This has to be done manually */
            (void)seq;
            for (int i = 0; i < oparg; i++) {
                OUT_OF_SPACE_IF_NULL(values[i] = sym_new_unknown(ctx));
            }
            stack_pointer += -1 + oparg;
            break;
        }

        case _UNPACK_SEQUENCE_TWO_TUPLE: {
            _Py_UopsSymbol *val1;
            _Py_UopsSymbol *val0;
            val1 = sym_new_unknown(ctx);
            if (val1 == NULL) goto out_of_space;
            val0 = sym_new_unknown(ctx);
            if (val0 == NULL) goto out_of_space;
            stack_pointer[-1] = val1;
            stack_pointer[0] = val0;
            stack_pointer += 1;
            break;
        }

        case _UNPACK_SEQUENCE_TUPLE: {
            _Py_UopsSymbol **values;
            values = &stack_pointer[-1];
            for (int _i = oparg; --_i >= 0;) {
                values[_i] = sym_new_unknown(ctx);
                if (values[_i] == NULL) goto out_of_space;
            }
            stack_pointer += -1 + oparg;
            break;
        }

        case _UNPACK_SEQUENCE_LIST: {
            _Py_UopsSymbol **values;
            values = &stack_pointer[-1];
            for (int _i = oparg; --_i >= 0;) {
                values[_i] = sym_new_unknown(ctx);
                if (values[_i] == NULL) goto out_of_space;
            }
            stack_pointer += -1 + oparg;
            break;
        }

        case _UNPACK_EX: {
            _Py_UopsSymbol *seq;
            _Py_UopsSymbol **values;
            seq = stack_pointer[-1];
            values = &stack_pointer[-1];
            /* This has to be done manually */
            (void)seq;
            int totalargs = (oparg & 0xFF) + (oparg >> 8) + 1;
            for (int i = 0; i < totalargs; i++) {
                OUT_OF_SPACE_IF_NULL(values[i] = sym_new_unknown(ctx));
            }
            stack_pointer += (oparg >> 8) + (oparg & 0xFF);
            break;
        }

        case _STORE_ATTR: {
            stack_pointer += -2;
            break;
        }

        case _DELETE_ATTR: {
            stack_pointer += -1;
            break;
        }

        case _STORE_GLOBAL: {
            stack_pointer += -1;
            break;
        }

        case _DELETE_GLOBAL: {
            break;
        }

        case _LOAD_LOCALS: {
            _Py_UopsSymbol *locals;
            locals = sym_new_unknown(ctx);
            if (locals == NULL) goto out_of_space;
            stack_pointer[0] = locals;
            stack_pointer += 1;
            break;
        }

        case _LOAD_FROM_DICT_OR_GLOBALS: {
            _Py_UopsSymbol *v;
            v = sym_new_unknown(ctx);
            if (v == NULL) goto out_of_space;
            stack_pointer[-1] = v;
            break;
        }

        case _LOAD_NAME: {
            _Py_UopsSymbol *v;
            v = sym_new_unknown(ctx);
            if (v == NULL) goto out_of_space;
            stack_pointer[0] = v;
            stack_pointer += 1;
            break;
        }

        case _LOAD_GLOBAL: {
            _Py_UopsSymbol *res;
            _Py_UopsSymbol *null = NULL;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            null = sym_new_null(ctx);
            if (null == NULL) goto out_of_space;
            stack_pointer[0] = res;
            if (oparg & 1) stack_pointer[1] = null;
            stack_pointer += 1 + (oparg & 1);
            break;
        }

        case _GUARD_GLOBALS_VERSION: {
            break;
        }

        case _GUARD_BUILTINS_VERSION: {
            break;
        }

        case _LOAD_GLOBAL_MODULE: {
            _Py_UopsSymbol *res;
            _Py_UopsSymbol *null = NULL;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            null = sym_new_null(ctx);
            if (null == NULL) goto out_of_space;
            stack_pointer[0] = res;
            if (oparg & 1) stack_pointer[1] = null;
            stack_pointer += 1 + (oparg & 1);
            break;
        }

        case _LOAD_GLOBAL_BUILTINS: {
            _Py_UopsSymbol *res;
            _Py_UopsSymbol *null = NULL;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            null = sym_new_null(ctx);
            if (null == NULL) goto out_of_space;
            stack_pointer[0] = res;
            if (oparg & 1) stack_pointer[1] = null;
            stack_pointer += 1 + (oparg & 1);
            break;
        }

        case _DELETE_FAST: {
            break;
        }

        case _MAKE_CELL: {
            break;
        }

        case _DELETE_DEREF: {
            break;
        }

        case _LOAD_FROM_DICT_OR_DEREF: {
            _Py_UopsSymbol *value;
            value = sym_new_unknown(ctx);
            if (value == NULL) goto out_of_space;
            stack_pointer[-1] = value;
            break;
        }

        case _LOAD_DEREF: {
            _Py_UopsSymbol *value;
            value = sym_new_unknown(ctx);
            if (value == NULL) goto out_of_space;
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _STORE_DEREF: {
            stack_pointer += -1;
            break;
        }

        case _COPY_FREE_VARS: {
            break;
        }

        case _BUILD_STRING: {
            _Py_UopsSymbol *str;
            str = sym_new_unknown(ctx);
            if (str == NULL) goto out_of_space;
            stack_pointer[-oparg] = str;
            stack_pointer += 1 - oparg;
            break;
        }

        case _BUILD_TUPLE: {
            _Py_UopsSymbol *tup;
            tup = sym_new_unknown(ctx);
            if (tup == NULL) goto out_of_space;
            stack_pointer[-oparg] = tup;
            stack_pointer += 1 - oparg;
            break;
        }

        case _BUILD_LIST: {
            _Py_UopsSymbol *list;
            list = sym_new_unknown(ctx);
            if (list == NULL) goto out_of_space;
            stack_pointer[-oparg] = list;
            stack_pointer += 1 - oparg;
            break;
        }

        case _LIST_EXTEND: {
            stack_pointer += -1;
            break;
        }

        case _SET_UPDATE: {
            stack_pointer += -1;
            break;
        }

        case _BUILD_SET: {
            _Py_UopsSymbol *set;
            set = sym_new_unknown(ctx);
            if (set == NULL) goto out_of_space;
            stack_pointer[-oparg] = set;
            stack_pointer += 1 - oparg;
            break;
        }

        case _BUILD_MAP: {
            _Py_UopsSymbol *map;
            map = sym_new_unknown(ctx);
            if (map == NULL) goto out_of_space;
            stack_pointer[-oparg*2] = map;
            stack_pointer += 1 - oparg*2;
            break;
        }

        case _SETUP_ANNOTATIONS: {
            break;
        }

        case _BUILD_CONST_KEY_MAP: {
            _Py_UopsSymbol *map;
            map = sym_new_unknown(ctx);
            if (map == NULL) goto out_of_space;
            stack_pointer[-1 - oparg] = map;
            stack_pointer += -oparg;
            break;
        }

        case _DICT_UPDATE: {
            stack_pointer += -1;
            break;
        }

        case _DICT_MERGE: {
            stack_pointer += -1;
            break;
        }

        case _MAP_ADD: {
            stack_pointer += -2;
            break;
        }

        /* _INSTRUMENTED_LOAD_SUPER_ATTR is not a viable micro-op for tier 2 */

        case _LOAD_SUPER_ATTR_ATTR: {
            _Py_UopsSymbol *attr;
            attr = sym_new_unknown(ctx);
            if (attr == NULL) goto out_of_space;
            stack_pointer[-3] = attr;
            stack_pointer += -2;
            break;
        }

        case _LOAD_SUPER_ATTR_METHOD: {
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *self_or_null;
            attr = sym_new_unknown(ctx);
            if (attr == NULL) goto out_of_space;
            self_or_null = sym_new_unknown(ctx);
            if (self_or_null == NULL) goto out_of_space;
            stack_pointer[-3] = attr;
            stack_pointer[-2] = self_or_null;
            stack_pointer += -1;
            break;
        }

        case _LOAD_ATTR: {
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *self_or_null = NULL;
            attr = sym_new_unknown(ctx);
            if (attr == NULL) goto out_of_space;
            self_or_null = sym_new_unknown(ctx);
            if (self_or_null == NULL) goto out_of_space;
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = self_or_null;
            stack_pointer += (oparg & 1);
            break;
        }

        case _GUARD_TYPE_VERSION: {
            break;
        }

        case _CHECK_MANAGED_OBJECT_HAS_VALUES: {
            break;
        }

        case _LOAD_ATTR_INSTANCE_VALUE: {
            _Py_UopsSymbol *owner;
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *null = NULL;
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)this_instr->operand;
            _LOAD_ATTR_NOT_NULL
            (void)index;
            (void)owner;
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = null;
            stack_pointer += (oparg & 1);
            break;
        }

        case _CHECK_ATTR_MODULE: {
            _Py_UopsSymbol *owner;
            owner = stack_pointer[-1];
            uint32_t dict_version = (uint32_t)this_instr->operand;
            (void)dict_version;
            if (sym_is_const(owner)) {
                PyObject *cnst = sym_get_const(owner);
                if (PyModule_CheckExact(cnst)) {
                    PyModuleObject *mod = (PyModuleObject *)cnst;
                    PyObject *dict = mod->md_dict;
                    uint64_t watched_mutations = get_mutations(dict);
                    if (watched_mutations < _Py_MAX_ALLOWED_GLOBALS_MODIFICATIONS) {
                        PyDict_Watch(GLOBALS_WATCHER_ID, dict);
                        _Py_BloomFilter_Add(dependencies, dict);
                        this_instr->opcode = _NOP;
                    }
                }
            }
            break;
        }

        case _LOAD_ATTR_MODULE: {
            _Py_UopsSymbol *owner;
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *null = NULL;
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)this_instr->operand;
            (void)index;
            OUT_OF_SPACE_IF_NULL(null = sym_new_null(ctx));
            attr = NULL;
            if (this_instr[-1].opcode == _NOP) {
                // Preceding _CHECK_ATTR_MODULE was removed: mod is const and dict is watched.
                assert(sym_is_const(owner));
                PyModuleObject *mod = (PyModuleObject *)sym_get_const(owner);
                assert(PyModule_CheckExact(mod));
                PyObject *dict = mod->md_dict;
                PyObject *res = convert_global_to_const(this_instr, dict);
                if (res != NULL) {
                    this_instr[-1].opcode = _POP_TOP;
                    OUT_OF_SPACE_IF_NULL(attr = sym_new_const(ctx, res));
                }
            }
            if (attr == NULL) {
                /* No conversion made. We don't know what `attr` is. */
                OUT_OF_SPACE_IF_NULL(attr = sym_new_not_null(ctx));
            }
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = null;
            stack_pointer += (oparg & 1);
            break;
        }

        case _CHECK_ATTR_WITH_HINT: {
            break;
        }

        case _LOAD_ATTR_WITH_HINT: {
            _Py_UopsSymbol *owner;
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *null = NULL;
            owner = stack_pointer[-1];
            uint16_t hint = (uint16_t)this_instr->operand;
            _LOAD_ATTR_NOT_NULL
            (void)hint;
            (void)owner;
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = null;
            stack_pointer += (oparg & 1);
            break;
        }

        case _LOAD_ATTR_SLOT: {
            _Py_UopsSymbol *owner;
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *null = NULL;
            owner = stack_pointer[-1];
            uint16_t index = (uint16_t)this_instr->operand;
            _LOAD_ATTR_NOT_NULL
            (void)index;
            (void)owner;
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = null;
            stack_pointer += (oparg & 1);
            break;
        }

        case _CHECK_ATTR_CLASS: {
            break;
        }

        case _LOAD_ATTR_CLASS: {
            _Py_UopsSymbol *owner;
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *null = NULL;
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)this_instr->operand;
            _LOAD_ATTR_NOT_NULL
            (void)descr;
            (void)owner;
            stack_pointer[-1] = attr;
            if (oparg & 1) stack_pointer[0] = null;
            stack_pointer += (oparg & 1);
            break;
        }

        /* _LOAD_ATTR_PROPERTY is not a viable micro-op for tier 2 */

        /* _LOAD_ATTR_GETATTRIBUTE_OVERRIDDEN is not a viable micro-op for tier 2 */

        case _GUARD_DORV_VALUES: {
            break;
        }

        case _STORE_ATTR_INSTANCE_VALUE: {
            stack_pointer += -2;
            break;
        }

        /* _STORE_ATTR_WITH_HINT is not a viable micro-op for tier 2 */

        case _STORE_ATTR_SLOT: {
            stack_pointer += -2;
            break;
        }

        case _COMPARE_OP: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            (void)left;
            (void)right;
            if (oparg & 16) {
                OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
            }
            else {
                OUT_OF_SPACE_IF_NULL(res = _Py_uop_sym_new_not_null(ctx));
            }
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _COMPARE_OP_FLOAT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            (void)left;
            (void)right;
            OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _COMPARE_OP_INT: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            (void)left;
            (void)right;
            OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _COMPARE_OP_STR: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            (void)left;
            (void)right;
            OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _IS_OP: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            (void)left;
            (void)right;
            OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _CONTAINS_OP: {
            _Py_UopsSymbol *right;
            _Py_UopsSymbol *left;
            _Py_UopsSymbol *res;
            right = stack_pointer[-1];
            left = stack_pointer[-2];
            (void)left;
            (void)right;
            OUT_OF_SPACE_IF_NULL(res = sym_new_type(ctx, &PyBool_Type));
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _CONTAINS_OP_SET: {
            _Py_UopsSymbol *b;
            b = sym_new_unknown(ctx);
            if (b == NULL) goto out_of_space;
            stack_pointer[-2] = b;
            stack_pointer += -1;
            break;
        }

        case _CONTAINS_OP_DICT: {
            _Py_UopsSymbol *b;
            b = sym_new_unknown(ctx);
            if (b == NULL) goto out_of_space;
            stack_pointer[-2] = b;
            stack_pointer += -1;
            break;
        }

        case _CHECK_EG_MATCH: {
            _Py_UopsSymbol *rest;
            _Py_UopsSymbol *match;
            rest = sym_new_unknown(ctx);
            if (rest == NULL) goto out_of_space;
            match = sym_new_unknown(ctx);
            if (match == NULL) goto out_of_space;
            stack_pointer[-2] = rest;
            stack_pointer[-1] = match;
            break;
        }

        case _CHECK_EXC_MATCH: {
            _Py_UopsSymbol *b;
            b = sym_new_unknown(ctx);
            if (b == NULL) goto out_of_space;
            stack_pointer[-1] = b;
            break;
        }

        /* _POP_JUMP_IF_FALSE is not a viable micro-op for tier 2 */

        /* _POP_JUMP_IF_TRUE is not a viable micro-op for tier 2 */

        case _IS_NONE: {
            _Py_UopsSymbol *b;
            b = sym_new_unknown(ctx);
            if (b == NULL) goto out_of_space;
            stack_pointer[-1] = b;
            break;
        }

        case _GET_LEN: {
            _Py_UopsSymbol *len_o;
            len_o = sym_new_unknown(ctx);
            if (len_o == NULL) goto out_of_space;
            stack_pointer[0] = len_o;
            stack_pointer += 1;
            break;
        }

        case _MATCH_CLASS: {
            _Py_UopsSymbol *attrs;
            attrs = sym_new_unknown(ctx);
            if (attrs == NULL) goto out_of_space;
            stack_pointer[-3] = attrs;
            stack_pointer += -2;
            break;
        }

        case _MATCH_MAPPING: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _MATCH_SEQUENCE: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _MATCH_KEYS: {
            _Py_UopsSymbol *values_or_none;
            values_or_none = sym_new_unknown(ctx);
            if (values_or_none == NULL) goto out_of_space;
            stack_pointer[0] = values_or_none;
            stack_pointer += 1;
            break;
        }

        case _GET_ITER: {
            _Py_UopsSymbol *iter;
            iter = sym_new_unknown(ctx);
            if (iter == NULL) goto out_of_space;
            stack_pointer[-1] = iter;
            break;
        }

        case _GET_YIELD_FROM_ITER: {
            _Py_UopsSymbol *iter;
            iter = sym_new_unknown(ctx);
            if (iter == NULL) goto out_of_space;
            stack_pointer[-1] = iter;
            break;
        }

        /* _FOR_ITER is not a viable micro-op for tier 2 */

        case _FOR_ITER_TIER_TWO: {
            _Py_UopsSymbol *next;
            next = sym_new_unknown(ctx);
            if (next == NULL) goto out_of_space;
            stack_pointer[0] = next;
            stack_pointer += 1;
            break;
        }

        /* _INSTRUMENTED_FOR_ITER is not a viable micro-op for tier 2 */

        case _ITER_CHECK_LIST: {
            break;
        }

        /* _ITER_JUMP_LIST is not a viable micro-op for tier 2 */

        case _GUARD_NOT_EXHAUSTED_LIST: {
            break;
        }

        case _ITER_NEXT_LIST: {
            _Py_UopsSymbol *next;
            next = sym_new_unknown(ctx);
            if (next == NULL) goto out_of_space;
            stack_pointer[0] = next;
            stack_pointer += 1;
            break;
        }

        case _ITER_CHECK_TUPLE: {
            break;
        }

        /* _ITER_JUMP_TUPLE is not a viable micro-op for tier 2 */

        case _GUARD_NOT_EXHAUSTED_TUPLE: {
            break;
        }

        case _ITER_NEXT_TUPLE: {
            _Py_UopsSymbol *next;
            next = sym_new_unknown(ctx);
            if (next == NULL) goto out_of_space;
            stack_pointer[0] = next;
            stack_pointer += 1;
            break;
        }

        case _ITER_CHECK_RANGE: {
            break;
        }

        /* _ITER_JUMP_RANGE is not a viable micro-op for tier 2 */

        case _GUARD_NOT_EXHAUSTED_RANGE: {
            break;
        }

        case _ITER_NEXT_RANGE: {
            _Py_UopsSymbol *iter;
            _Py_UopsSymbol *next;
            iter = stack_pointer[-1];
            OUT_OF_SPACE_IF_NULL(next = sym_new_type(ctx, &PyLong_Type));
            (void)iter;
            stack_pointer[0] = next;
            stack_pointer += 1;
            break;
        }

        /* _FOR_ITER_GEN is not a viable micro-op for tier 2 */

        case _BEFORE_ASYNC_WITH: {
            _Py_UopsSymbol *exit;
            _Py_UopsSymbol *res;
            exit = sym_new_unknown(ctx);
            if (exit == NULL) goto out_of_space;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-1] = exit;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _BEFORE_WITH: {
            _Py_UopsSymbol *exit;
            _Py_UopsSymbol *res;
            exit = sym_new_unknown(ctx);
            if (exit == NULL) goto out_of_space;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-1] = exit;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _WITH_EXCEPT_START: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[0] = res;
            stack_pointer += 1;
            break;
        }

        case _PUSH_EXC_INFO: {
            _Py_UopsSymbol *prev_exc;
            _Py_UopsSymbol *new_exc;
            prev_exc = sym_new_unknown(ctx);
            if (prev_exc == NULL) goto out_of_space;
            new_exc = sym_new_unknown(ctx);
            if (new_exc == NULL) goto out_of_space;
            stack_pointer[-1] = prev_exc;
            stack_pointer[0] = new_exc;
            stack_pointer += 1;
            break;
        }

        case _GUARD_DORV_VALUES_INST_ATTR_FROM_DICT: {
            break;
        }

        case _GUARD_KEYS_VERSION: {
            break;
        }

        case _LOAD_ATTR_METHOD_WITH_VALUES: {
            _Py_UopsSymbol *owner;
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *self = NULL;
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)this_instr->operand;
            (void)descr;
            OUT_OF_SPACE_IF_NULL(attr = sym_new_not_null(ctx));
            self = owner;
            stack_pointer[-1] = attr;
            stack_pointer[0] = self;
            stack_pointer += 1;
            break;
        }

        case _LOAD_ATTR_METHOD_NO_DICT: {
            _Py_UopsSymbol *owner;
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *self = NULL;
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)this_instr->operand;
            (void)descr;
            OUT_OF_SPACE_IF_NULL(attr = sym_new_not_null(ctx));
            self = owner;
            stack_pointer[-1] = attr;
            stack_pointer[0] = self;
            stack_pointer += 1;
            break;
        }

        case _LOAD_ATTR_NONDESCRIPTOR_WITH_VALUES: {
            _Py_UopsSymbol *attr;
            attr = sym_new_unknown(ctx);
            if (attr == NULL) goto out_of_space;
            stack_pointer[-1] = attr;
            break;
        }

        case _LOAD_ATTR_NONDESCRIPTOR_NO_DICT: {
            _Py_UopsSymbol *attr;
            attr = sym_new_unknown(ctx);
            if (attr == NULL) goto out_of_space;
            stack_pointer[-1] = attr;
            break;
        }

        case _CHECK_ATTR_METHOD_LAZY_DICT: {
            break;
        }

        case _LOAD_ATTR_METHOD_LAZY_DICT: {
            _Py_UopsSymbol *owner;
            _Py_UopsSymbol *attr;
            _Py_UopsSymbol *self = NULL;
            owner = stack_pointer[-1];
            PyObject *descr = (PyObject *)this_instr->operand;
            (void)descr;
            OUT_OF_SPACE_IF_NULL(attr = sym_new_not_null(ctx));
            self = owner;
            stack_pointer[-1] = attr;
            stack_pointer[0] = self;
            stack_pointer += 1;
            break;
        }

        /* _INSTRUMENTED_CALL is not a viable micro-op for tier 2 */

        /* _CALL is not a viable micro-op for tier 2 */

        case _CHECK_CALL_BOUND_METHOD_EXACT_ARGS: {
            _Py_UopsSymbol *null;
            _Py_UopsSymbol *callable;
            null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            if (!sym_set_null(null)) {
                goto hit_bottom;
            }
            if (!sym_set_type(callable, &PyMethod_Type)) {
                goto hit_bottom;
            }
            break;
        }

        case _INIT_CALL_BOUND_METHOD_EXACT_ARGS: {
            _Py_UopsSymbol *callable;
            _Py_UopsSymbol *func;
            _Py_UopsSymbol *self;
            callable = stack_pointer[-2 - oparg];
            (void)callable;
            OUT_OF_SPACE_IF_NULL(func = sym_new_not_null(ctx));
            OUT_OF_SPACE_IF_NULL(self = sym_new_not_null(ctx));
            stack_pointer[-2 - oparg] = func;
            stack_pointer[-1 - oparg] = self;
            break;
        }

        case _CHECK_PEP_523: {
            break;
        }

        case _CHECK_FUNCTION_EXACT_ARGS: {
            _Py_UopsSymbol *self_or_null;
            _Py_UopsSymbol *callable;
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            uint32_t func_version = (uint32_t)this_instr->operand;
            if (!sym_set_type(callable, &PyFunction_Type)) {
                goto hit_bottom;
            }
            (void)self_or_null;
            (void)func_version;
            break;
        }

        case _CHECK_STACK_SPACE: {
            break;
        }

        case _INIT_CALL_PY_EXACT_ARGS: {
            _Py_UopsSymbol **args;
            _Py_UopsSymbol *self_or_null;
            _Py_UopsSymbol *callable;
            _Py_UOpsAbstractFrame *new_frame;
            args = &stack_pointer[-oparg];
            self_or_null = stack_pointer[-1 - oparg];
            callable = stack_pointer[-2 - oparg];
            int argcount = oparg;
            (void)callable;
            PyFunctionObject *func = (PyFunctionObject *)(this_instr + 2)->operand;
            if (func == NULL) {
                goto error;
            }
            PyCodeObject *co = (PyCodeObject *)func->func_code;
            assert(self_or_null != NULL);
            assert(args != NULL);
            if (sym_is_not_null(self_or_null)) {
                // Bound method fiddling, same as _INIT_CALL_PY_EXACT_ARGS in VM
                args--;
                argcount++;
            }
            _Py_UopsSymbol **localsplus_start = ctx->n_consumed;
            int n_locals_already_filled = 0;
            // Can determine statically, so we interleave the new locals
            // and make the current stack the new locals.
            // This also sets up for true call inlining.
            if (sym_is_null(self_or_null) || sym_is_not_null(self_or_null)) {
                localsplus_start = args;
                n_locals_already_filled = argcount;
            }
            OUT_OF_SPACE_IF_NULL(new_frame =
                             frame_new(ctx, co, localsplus_start, n_locals_already_filled, 0));
            stack_pointer[-2 - oparg] = (_Py_UopsSymbol *)new_frame;
            stack_pointer += -1 - oparg;
            break;
        }

        case _PUSH_FRAME: {
            _Py_UOpsAbstractFrame *new_frame;
            new_frame = (_Py_UOpsAbstractFrame *)stack_pointer[-1];
            stack_pointer += -1;
            ctx->frame->stack_pointer = stack_pointer;
            ctx->frame = new_frame;
            ctx->curr_frame_depth++;
            stack_pointer = new_frame->stack_pointer;
            break;
        }

        /* _CALL_PY_WITH_DEFAULTS is not a viable micro-op for tier 2 */

        case _CALL_TYPE_1: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-3] = res;
            stack_pointer += -2;
            break;
        }

        case _CALL_STR_1: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-3] = res;
            stack_pointer += -2;
            break;
        }

        case _CALL_TUPLE_1: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-3] = res;
            stack_pointer += -2;
            break;
        }

        /* _CALL_ALLOC_AND_ENTER_INIT is not a viable micro-op for tier 2 */

        case _EXIT_INIT_CHECK: {
            stack_pointer += -1;
            break;
        }

        case _CALL_BUILTIN_CLASS: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_BUILTIN_O: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_BUILTIN_FAST: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_BUILTIN_FAST_WITH_KEYWORDS: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_LEN: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_ISINSTANCE: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_O: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_NOARGS: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        case _CALL_METHOD_DESCRIPTOR_FAST: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2 - oparg] = res;
            stack_pointer += -1 - oparg;
            break;
        }

        /* _INSTRUMENTED_CALL_KW is not a viable micro-op for tier 2 */

        /* _CALL_KW is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_CALL_FUNCTION_EX is not a viable micro-op for tier 2 */

        /* _CALL_FUNCTION_EX is not a viable micro-op for tier 2 */

        case _MAKE_FUNCTION: {
            _Py_UopsSymbol *func;
            func = sym_new_unknown(ctx);
            if (func == NULL) goto out_of_space;
            stack_pointer[-1] = func;
            break;
        }

        case _SET_FUNCTION_ATTRIBUTE: {
            _Py_UopsSymbol *func;
            func = sym_new_unknown(ctx);
            if (func == NULL) goto out_of_space;
            stack_pointer[-2] = func;
            stack_pointer += -1;
            break;
        }

        case _BUILD_SLICE: {
            _Py_UopsSymbol *slice;
            slice = sym_new_unknown(ctx);
            if (slice == NULL) goto out_of_space;
            stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice;
            stack_pointer += -1 - ((oparg == 3) ? 1 : 0);
            break;
        }

        case _CONVERT_VALUE: {
            _Py_UopsSymbol *result;
            result = sym_new_unknown(ctx);
            if (result == NULL) goto out_of_space;
            stack_pointer[-1] = result;
            break;
        }

        case _FORMAT_SIMPLE: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-1] = res;
            break;
        }

        case _FORMAT_WITH_SPEC: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _COPY: {
            _Py_UopsSymbol *bottom;
            _Py_UopsSymbol *top;
            bottom = stack_pointer[-1 - (oparg-1)];
            assert(oparg > 0);
            top = bottom;
            stack_pointer[0] = top;
            stack_pointer += 1;
            break;
        }

        case _BINARY_OP: {
            _Py_UopsSymbol *res;
            res = sym_new_unknown(ctx);
            if (res == NULL) goto out_of_space;
            stack_pointer[-2] = res;
            stack_pointer += -1;
            break;
        }

        case _SWAP: {
            _Py_UopsSymbol *top;
            _Py_UopsSymbol *bottom;
            top = stack_pointer[-1];
            bottom = stack_pointer[-2 - (oparg-2)];
            stack_pointer[-2 - (oparg-2)] = top;
            stack_pointer[-1] = bottom;
            break;
        }

        /* _INSTRUMENTED_INSTRUCTION is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_JUMP_FORWARD is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_JUMP_BACKWARD is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_POP_JUMP_IF_TRUE is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_POP_JUMP_IF_FALSE is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_POP_JUMP_IF_NONE is not a viable micro-op for tier 2 */

        /* _INSTRUMENTED_POP_JUMP_IF_NOT_NONE is not a viable micro-op for tier 2 */

        case _GUARD_IS_TRUE_POP: {
            _Py_UopsSymbol *flag;
            flag = stack_pointer[-1];
            if (sym_is_const(flag)) {
                PyObject *value = sym_get_const(flag);
                assert(value != NULL);
                eliminate_pop_guard(this_instr, value != Py_True);
            }
            stack_pointer += -1;
            break;
        }

        case _GUARD_IS_FALSE_POP: {
            _Py_UopsSymbol *flag;
            flag = stack_pointer[-1];
            if (sym_is_const(flag)) {
                PyObject *value = sym_get_const(flag);
                assert(value != NULL);
                eliminate_pop_guard(this_instr, value != Py_False);
            }
            stack_pointer += -1;
            break;
        }

        case _GUARD_IS_NONE_POP: {
            _Py_UopsSymbol *flag;
            flag = stack_pointer[-1];
            if (sym_is_const(flag)) {
                PyObject *value = sym_get_const(flag);
                assert(value != NULL);
                eliminate_pop_guard(this_instr, !Py_IsNone(value));
            }
            else if (sym_has_type(flag)) {
                assert(!sym_matches_type(flag, &_PyNone_Type));
                eliminate_pop_guard(this_instr, true);
            }
            stack_pointer += -1;
            break;
        }

        case _GUARD_IS_NOT_NONE_POP: {
            _Py_UopsSymbol *flag;
            flag = stack_pointer[-1];
            if (sym_is_const(flag)) {
                PyObject *value = sym_get_const(flag);
                assert(value != NULL);
                eliminate_pop_guard(this_instr, Py_IsNone(value));
            }
            else if (sym_has_type(flag)) {
                assert(!sym_matches_type(flag, &_PyNone_Type));
                eliminate_pop_guard(this_instr, false);
            }
            stack_pointer += -1;
            break;
        }

        case _JUMP_TO_TOP: {
            break;
        }

        case _SET_IP: {
            break;
        }

        case _SAVE_RETURN_OFFSET: {
            break;
        }

        case _EXIT_TRACE: {
            break;
        }

        case _CHECK_VALIDITY: {
            break;
        }

        case _LOAD_CONST_INLINE: {
            _Py_UopsSymbol *value;
            PyObject *ptr = (PyObject *)this_instr->operand;
            OUT_OF_SPACE_IF_NULL(value = sym_new_const(ctx, ptr));
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _LOAD_CONST_INLINE_BORROW: {
            _Py_UopsSymbol *value;
            PyObject *ptr = (PyObject *)this_instr->operand;
            OUT_OF_SPACE_IF_NULL(value = sym_new_const(ctx, ptr));
            stack_pointer[0] = value;
            stack_pointer += 1;
            break;
        }

        case _POP_TOP_LOAD_CONST_INLINE_BORROW: {
            _Py_UopsSymbol *value;
            value = sym_new_unknown(ctx);
            if (value == NULL) goto out_of_space;
            stack_pointer[-1] = value;
            break;
        }

        case _LOAD_CONST_INLINE_WITH_NULL: {
            _Py_UopsSymbol *value;
            _Py_UopsSymbol *null;
            PyObject *ptr = (PyObject *)this_instr->operand;
            OUT_OF_SPACE_IF_NULL(value = sym_new_const(ctx, ptr));
            OUT_OF_SPACE_IF_NULL(null = sym_new_null(ctx));
            stack_pointer[0] = value;
            stack_pointer[1] = null;
            stack_pointer += 2;
            break;
        }

        case _LOAD_CONST_INLINE_BORROW_WITH_NULL: {
            _Py_UopsSymbol *value;
            _Py_UopsSymbol *null;
            PyObject *ptr = (PyObject *)this_instr->operand;
            OUT_OF_SPACE_IF_NULL(value = sym_new_const(ctx, ptr));
            OUT_OF_SPACE_IF_NULL(null = sym_new_null(ctx));
            stack_pointer[0] = value;
            stack_pointer[1] = null;
            stack_pointer += 2;
            break;
        }

        case _CHECK_FUNCTION: {
            break;
        }

        case _INTERNAL_INCREMENT_OPT_COUNTER: {
            stack_pointer += -1;
            break;
        }

        case _COLD_EXIT: {
            break;
        }

        case _START_EXECUTOR: {
            break;
        }

        case _FATAL_ERROR: {
            break;
        }

        case _CHECK_VALIDITY_AND_SET_IP: {
            break;
        }

