fix: 'inline error' for ../examples/list_test.c, fix x64 opcode for array index master
authoryu.dongliang <18588496441@163.com>
Thu, 23 Oct 2025 10:56:13 +0000 (18:56 +0800)
committeryu.dongliang <18588496441@163.com>
Thu, 23 Oct 2025 10:56:13 +0000 (18:56 +0800)
core/scf_optimizer_inline.c
native/x64/scf_x64_reg.c

index 233fe196ef24cc911f27bfd67aa950faff231751..f7105787b59f944a56d0ea6aad87fb63a2d19ff4 100644 (file)
@@ -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
index 765e4ed464cbfbe42934eae44c83bf2941c91dde..36b1bd70c5aaf8e15c908ad26de0c81b6219c3dd 100644 (file)
@@ -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;
        }