From 07d896c8e5d1b46bf4aebd403c78e5f7ffebe02a Mon Sep 17 00:00:00 2001 From: seyko Date: Wed, 4 May 2016 17:23:25 +0300 Subject: [PATCH] sym_push2 optimized for the local_stack case. A constant expression removed from the loop. If subroutine have 50000+ local variables, then currently compilation of such code takes obly 15 sec. Was 2 min. gcc-4.1.2 compiles such code in 7 sec. pcc -- 3.44 min. A test generator: #include int main() { puts("#include "); puts("int main()"); puts("{"); for (int i = 0; i < 50000; ++i) printf("int X%d = 1;\n", i); for (int i = 0; i < 50000; ++i) puts("scanf(\"%d\", &X0);"); puts("}"); return 0; } --- tccgen.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tccgen.c b/tccgen.c index 898856c0..48701f97 100644 --- a/tccgen.c +++ b/tccgen.c @@ -167,9 +167,9 @@ ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c) { Sym *s; if (!tcc_state->no_type_redef_check) { - if (ps == &local_stack) { - for (s = *ps; s && s != scope_stack_bottom; s = s->prev) - if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM && s->v == v) + if ((ps == &local_stack) && !(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM) { + for (s = *ps; s != scope_stack_bottom; s = s->prev) + if (s->v == v) tcc_error("incompatible types for redefinition of '%s'", get_tok_str(v, NULL)); }