Skip to content

Commit

Permalink
Optimize the first non-trivial function arg to not spill
Browse files Browse the repository at this point in the history
  • Loading branch information
fuhsnn committed Mar 10, 2025
1 parent 852e1fb commit 6b29ae5
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions codegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -1424,19 +1424,18 @@ static void gen_funcall_args(Node *node) {
if (var->ptr)
gen_var_assign(var, var->arg_expr);

int gp = 0, fp = 0;
bool rtn_by_stk = node->ret_buffer && node->ty->size > 16;
if (rtn_by_stk)
Printftn("lea %d(%s), %s", node->ret_buffer->ofs, node->ret_buffer->ptr, argreg64[gp++]);
int gp = rtn_by_stk, fp = 0;

int reg_arg_cnt = 0;
for (Obj *var = node->args; var; var = var->param_next) {
if (var->pass_by_stack)
continue;

char ofs[STRBUF_SZ], *ptr;

if (opt_optimize) {
Node *arg_expr = var->arg_expr;
reg_arg_cnt++;

int64_t val;
if (is_gp_ty(arg_expr->ty) && is_const_expr(arg_expr, &val)) {
Expand All @@ -1457,10 +1456,21 @@ static void gen_funcall_args(Node *node) {
place_reg_arg(arg_expr->ty, ofs, ptr, &gp, &fp);
continue;
}
if (reg_arg_cnt == 1) {
gen_expr(arg_expr);
if (is_gp_ty(arg_expr->ty))
Printftn("mov %%rax, %s", argreg64[gp++]);
else
fp++;
continue;
}
}
snprintf(ofs, STRBUF_SZ, "%d", var->ofs);
place_reg_arg(var->ty, ofs, var->ptr, &gp, &fp);
}

if (rtn_by_stk)
Printftn("lea %d(%s), %%rdi", node->ret_buffer->ofs, node->ret_buffer->ptr);
}

static void gen_funcall(Node *node) {
Expand Down Expand Up @@ -4150,6 +4160,7 @@ void prepare_funcall(Node *node, Scope *scope) {
bool rtn_by_stk = node->ty->size > 16;
calling_convention(node->args, &(int){rtn_by_stk}, &(int){0}, NULL);

int reg_arg_cnt = 0;
for (Obj *var = node->args; var; var = var->param_next) {
var->is_local = true;
if (var->pass_by_stack) {
Expand All @@ -4159,6 +4170,7 @@ void prepare_funcall(Node *node, Scope *scope) {
}
if (opt_optimize) {
Node *arg_expr = var->arg_expr;
reg_arg_cnt++;

if (is_gp_ty(arg_expr->ty) && is_const_expr(arg_expr, &(int64_t){0}))
continue;
Expand All @@ -4168,6 +4180,8 @@ void prepare_funcall(Node *node, Scope *scope) {
continue;
if (has_memop(var->arg_expr))
continue;
if (reg_arg_cnt == 1)
continue;
}
var->next = scope->locals;
scope->locals = var;
Expand Down

0 comments on commit 6b29ae5

Please sign in to comment.