From e3568b88b7b07366be3d1c13eef0e56683afb5bc Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Wed, 17 Apr 2013 17:49:09 +0200 Subject: [PATCH] optimization passes can change stuff on globals, moving them into ir_function_optimize, outside ir_function_finalize threads; 'nil' is now of storetype store_global to avoid having it lifetime-analysed needlessly --- ir.c | 15 +++++++++++---- ir.h | 1 + parser.c | 8 +++++++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/ir.c b/ir.c index b178d3e..fd4e10e 100644 --- a/ir.c +++ b/ir.c @@ -317,7 +317,7 @@ ir_builder* ir_builder_new(const char *modulename) return NULL; } - self->nil = ir_value_var("nil", store_value, TYPE_NIL); + self->nil = ir_value_var("nil", store_global, TYPE_NIL); self->nil->cvq = CV_CONST; self->reserved_va_count = NULL; @@ -777,10 +777,8 @@ bool ir_function_pass_tailrecursion(ir_function *self) return true; } -bool ir_function_finalize(ir_function *self) +bool ir_function_optimize(ir_function *self) { - size_t i; - if (self->builtin) return true; @@ -802,6 +800,15 @@ bool ir_function_finalize(ir_function *self) irerror(self->context, "internal error: ir_function_naive_phi failed"); return false; } + return true; +} + +bool ir_function_finalize(ir_function *self) +{ + size_t i; + + if (self->builtin) + return true; for (i = 0; i < vec_size(self->locals); ++i) { ir_value *v = self->locals[i]; diff --git a/ir.h b/ir.h index 49da889..60d1a2d 100644 --- a/ir.h +++ b/ir.h @@ -292,6 +292,7 @@ bool ir_function_set_name(ir_function*, const char *name); ir_value* ir_function_create_local(ir_function *self, const char *name, int vtype, bool param); +bool GMQCC_WARN ir_function_optimize(ir_function*); bool GMQCC_WARN ir_function_finalize(ir_function*); /* bool ir_function_naive_phi(ir_function*); diff --git a/parser.c b/parser.c index 174c3ad..54d8c69 100644 --- a/parser.c +++ b/parser.c @@ -6167,7 +6167,13 @@ static bool function_finalize_all_threaded(ast_function **list, size_t count) bool function_finalize_all(ast_function **list, size_t count) { - size_t i = 0; + size_t i; + for (i = 0; i < count; ++i) { + if (!ir_function_optimize(list[i]->ir_func)) { + con_out("failed to optimize function %s\n", list[i]->name); + return false; + } + } if (OPTS_OPTION_U32(OPTION_J) > 1) return function_finalize_all_threaded(list, count); for (i = 0; i < count; ++i) { -- 2.39.5