From 9128bc70e9ee17a21f26e0e7ae8d8fbd36bc0553 Mon Sep 17 00:00:00 2001 From: "yu.dongliang" <18588496441@163.com> Date: Thu, 23 Oct 2025 18:56:13 +0800 Subject: [PATCH] fix: 'inline error' for ../examples/list_test.c, fix x64 opcode for array index --- core/scf_optimizer_inline.c | 21 ++++++++++----------- native/x64/scf_x64_reg.c | 21 +++++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/core/scf_optimizer_inline.c b/core/scf_optimizer_inline.c index 233fe19..f710578 100644 --- a/core/scf_optimizer_inline.c +++ b/core/scf_optimizer_inline.c @@ -378,6 +378,7 @@ static int _optimize_inline2(scf_ast_t* ast, scf_function_t* f) int n_calls = 0; bb_cur = bb; + bb_cur->call_flag = 0; for (l2 = scf_list_head(&bb->code_list_head); l2 != scf_list_sentinel(&bb->code_list_head); ) { c = scf_list_data(l2, scf_3ac_code_t, list); @@ -398,22 +399,22 @@ static int _optimize_inline2(scf_ast_t* ast, scf_function_t* f) src = c->srcs->data[0]; v = _scf_operand_get(src->node); - if (!v->const_literal_flag) + if (!v->const_literal_flag) { + bb_cur->call_flag |= n_calls > 0; continue; + } f2 = v->func_ptr; - if (!f2->node.define_flag) - continue; - - if (!f2->inline_flag) - continue; - - if (f2->vargs_flag) + if (!f2->node.define_flag || !f2->inline_flag || f2->vargs_flag) { + bb_cur->call_flag |= n_calls > 0; continue; + } - if (f2->nb_basic_blocks > 10) + if (f2->nb_basic_blocks > 10) { + bb_cur->call_flag |= n_calls > 0; continue; + } #if 1 bb2 = bb_cur; bb_cur->call_flag = 0; @@ -436,8 +437,6 @@ static int _optimize_inline2(scf_ast_t* ast, scf_function_t* f) } #endif } - - bb_cur->call_flag |= n_calls > 0; } #if 0 diff --git a/native/x64/scf_x64_reg.c b/native/x64/scf_x64_reg.c index 765e4ed..36b1bd7 100644 --- a/native/x64/scf_x64_reg.c +++ b/native/x64/scf_x64_reg.c @@ -251,9 +251,9 @@ int x64_caller_save_regs(scf_3ac_code_t* c, const char* regs[], int nb_regs, int scf_variable_t* v = dn->var; if (v && v->w) - scf_logw("dn: %#lx, v_%d/%s/%#lx\n", 0xffff & (uintptr_t)dn, v->w->line, v->w->text->data, 0xffff & (uintptr_t)v); + scf_logd("dn: %#lx, v_%d/%s/%#lx\n", 0xffff & (uintptr_t)dn, v->w->line, v->w->text->data, 0xffff & (uintptr_t)v); else - scf_logw("dn: %#lx, v_%#lx\n", 0xffff & (uintptr_t)dn, 0xffff & (uintptr_t)v); + scf_logd("dn: %#lx, v_%#lx\n", 0xffff & (uintptr_t)dn, 0xffff & (uintptr_t)v); break; } } @@ -1221,24 +1221,25 @@ int x64_array_index_reg(x64_sib_t* sib, scf_dag_node_t* base, scf_dag_node_t* in if (ri->bytes < ri2->bytes) { if (scf_variable_signed(index->var)) { - mov = x64_find_OpCode(SCF_X64_MOVSX, ri->bytes, ri2->bytes, SCF_X64_E2G); + mov = x64_find_OpCode(SCF_X64_MOVSX, ri->bytes, ri2->bytes, SCF_X64_E2G); + inst = x64_make_inst_E2G(mov, ri2, ri); + X64_INST_ADD_CHECK(c->instructions, inst); } else if (ri->bytes <= 2) { - mov = x64_find_OpCode(SCF_X64_MOVZX, ri->bytes, ri2->bytes, SCF_X64_E2G); + mov = x64_find_OpCode(SCF_X64_MOVZX, ri->bytes, ri2->bytes, SCF_X64_E2G); + inst = x64_make_inst_E2G(mov, ri2, ri); + X64_INST_ADD_CHECK(c->instructions, inst); } else { assert(4 == ri->bytes); - +/* xor = x64_find_OpCode(SCF_X64_XOR, 8, 8, SCF_X64_G2E); inst = x64_make_inst_G2E(xor, ri2, ri2); X64_INST_ADD_CHECK(c->instructions, inst); - - mov = x64_find_OpCode(SCF_X64_MOV, 4, 4, SCF_X64_E2G); + mov = x64_find_OpCode(SCF_X64_MOV, 4, 4, SCF_X64_E2G); +*/ } - inst = x64_make_inst_E2G(mov, ri2, ri); - X64_INST_ADD_CHECK(c->instructions, inst); - ri = ri2; } -- 2.25.1