U0 OptPass5(CCompCtrl *cc)
{
        CIntermediateCode       *tmpi, *tmpi1;
        I64                                      code, i;
        CParseStack                     *ps = cc->ps;

        ps->ptr = 0;
        ps->ptr2 = 0;

        tmpi = cc->coc.coc_head.next;
        while (code = tmpi->ic_code)
        {
                if (code >IC_NOP2)
                {
                        if (tmpi->ic_flags&ICF_PASS_TRACE) {
                                if (Bt(&cc->saved_pass_trace, 5))
                                {
                                        "%2d:", ps->ptr;
                                        ICPut(cc, tmpi);
                                }
                        }
                        if (intermediate_code_table[code].arg_count == IS_V_ARG)
                                ps->ptr -= tmpi->ic_data >> 3;
                        if (code == IC_PUSH_REGS)
                        {
                                for (i = 0; i < REG_REGS_NUM; i++)
                                        if (Bt(&tmpi->ic_data, i))
                                                ps->ptr++;
                        }
                        else if (code == IC_POP_REGS)
                        {
                                for (i = 0; i < REG_REGS_NUM; i++)
                                        if (Bt(&tmpi->ic_data, i))
                                                ps->ptr--;
                        }
                        if (tmpi->arg2.type & MDF_STACK)
                        {
                                tmpi1 = ParsePop(ps);
                                if (tmpi1->ic_code == IC_MOV || tmpi1->ic_code == IC_REG)
                                {
                                        if (tmpi1->ic_flags & ICF_RES_TO_INT)
                                        {
                                                if (tmpi1->arg1.type & MDF_IMM)
                                                        tmpi1->arg1.disp = tmpi1->arg1.disp(F64);
                                                else
                                                        tmpi->ic_flags |= ICF_ARG2_TO_INT;
                                        }
                                        else if (tmpi1->ic_flags & ICF_RES_TO_F64)
                                        {
                                                if (tmpi1->arg1.type & MDF_IMM)
                                                        tmpi1->arg1.disp(F64) = tmpi1->arg1.disp;
                                                else
                                                        tmpi->ic_flags |= ICF_ARG2_TO_F64;
                                        }
                                        tmpi->arg2.type = tmpi1->arg1.type & MDG_MASK +
                                                                MinI64(tmpi->arg2.type.raw_type, MinI64(tmpi1->res.type.raw_type, tmpi1->arg1.type.raw_type));
                                        tmpi->arg2.reg = tmpi1->arg1.reg;
                                        tmpi->arg2.disp = tmpi1->arg1.disp;
                                        tmpi->ic_flags |= tmpi1->ic_flags & ICG_NO_CONVERT_MASK;
                                        OptSetNOP2(tmpi1);
                                }
                        }

                        if (tmpi->arg1.type & MDF_STACK)
                        {
                                tmpi1 = ParsePop(ps);
                                if (tmpi1->ic_code == IC_MOV || tmpi1->ic_code == IC_REG)
                                {
                                        if (tmpi1->ic_flags & ICF_RES_TO_INT)
                                        {
                                                if (tmpi1->arg1.type & MDF_IMM)
                                                        tmpi1->arg1.disp = tmpi1->arg1.disp(F64);
                                                else
                                                        tmpi->ic_flags |= ICF_ARG1_TO_INT;
                                        }
                                        else if (tmpi1->ic_flags & ICF_RES_TO_F64)
                                        {
                                                if (tmpi1->arg1.type & MDF_IMM)
                                                {
                                                        if (tmpi1->arg1.type & RTF_UNSIGNED)
                                                                tmpi1->arg1.disp(F64) = tmpi1->arg1.disp(U64);
                                                        else
                                                                tmpi1->arg1.disp(F64) = tmpi1->arg1.disp(I64);
                                                }
                                                else
                                                        tmpi->ic_flags |= ICF_ARG1_TO_F64;
                                        }
                                        tmpi->arg1.type = tmpi1->arg1.type & MDG_MASK +
                                                                MinI64(tmpi->arg1.type.raw_type, MinI64(tmpi1->res.type.raw_type, tmpi1->arg1.type.raw_type));
                                        CompMinTypePointed(tmpi, tmpi1->arg1_type_pointed_to);
                                        tmpi->arg1.reg = tmpi1->arg1.reg;
                                        tmpi->arg1.disp = tmpi1->arg1.disp;
                                        tmpi->ic_flags |= tmpi1->ic_flags & ICG_NO_CONVERT_MASK;
                                        OptSetNOP2(tmpi1);
                                }
                        }
                        if (tmpi->res.type & MDF_STACK && !(tmpi->ic_flags & ICF_RES_NOT_USED))
                                ParsePush(ps, tmpi);
                }
                tmpi = tmpi->next;
        }
        if (ps->ptr > 2)
        {
                "Pass:%d Stack:%08X\n", cc->pass, ps->ptr;
                LexExcept(cc, "Compiler Optimization Error at ");
        }
}