aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorseyko <seyko2@gmail.com>2016-05-04 17:23:25 +0300
committerseyko <seyko2@gmail.com>2016-05-04 17:23:25 +0300
commit07d896c8e5d1b46bf4aebd403c78e5f7ffebe02a (patch)
treec91a4ef30e175f72b915a3b1520c6abf854d7e63
parent2bfedb18675228c3837c23fa523231f55e102c12 (diff)
downloadtinycc-07d896c8e5d1b46bf4aebd403c78e5f7ffebe02a.tar.gz
tinycc-07d896c8e5d1b46bf4aebd403c78e5f7ffebe02a.tar.bz2
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 <stdio.h> int main() { puts("#include <stdio.h>"); 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; }
-rw-r--r--tccgen.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/tccgen.c b/tccgen.c
index 898856c..48701f9 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));
}