]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
optimization passes can change stuff on globals, moving them into ir_function_optimiz...
authorWolfgang Bumiller <wry.git@bumiller.com>
Wed, 17 Apr 2013 15:49:09 +0000 (17:49 +0200)
committerWolfgang Bumiller <wry.git@bumiller.com>
Wed, 17 Apr 2013 15:49:09 +0000 (17:49 +0200)
ir.c
ir.h
parser.c

diff --git a/ir.c b/ir.c
index b178d3eb290f7b1bb89b44afcb82355be5f6398f..fd4e10e3cd40e9fd2f3acfb7f4bf1e579f9054cd 100644 (file)
--- 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 49da8897bd177560936ebfff6b33f1edf992b5ec..60d1a2d740c2e20c3822eb21a87cebef4d4f2e3a 100644 (file)
--- 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*);
index 174c3ad4923ce3419ab7b99d7a44e1169897e6b1..54d8c69fa0a544bccdc0a3f1368933d31437e866 100644 (file)
--- 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) {