diff options
| author | seyko <seyko2@gmail.com> | 2016-05-04 17:23:25 +0300 |
|---|---|---|
| committer | seyko <seyko2@gmail.com> | 2016-05-04 17:23:25 +0300 |
| commit | 07d896c8e5d1b46bf4aebd403c78e5f7ffebe02a (patch) | |
| tree | c91a4ef30e175f72b915a3b1520c6abf854d7e63 /tccgen.c | |
| parent | 2bfedb18675228c3837c23fa523231f55e102c12 (diff) | |
| download | tinycc-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;
}
Diffstat (limited to 'tccgen.c')
| -rw-r--r-- | tccgen.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -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)); } |
