diff options
| author | Pavlas, Zdenek <zden3k@gmail.com> | 2016-08-11 04:59:08 -0700 |
|---|---|---|
| committer | Pavlas, Zdenek <zden3k@gmail.com> | 2016-08-11 05:02:40 -0700 |
| commit | 71b622096334e5cb90efd3c184654cb5d65682ae (patch) | |
| tree | 6b43e8f55529661925425357ed7abf02618a3eea | |
| parent | 0a402f6e91c284dd37cb61e726cc95de20fe895e (diff) | |
| download | tinycc-71b622096334e5cb90efd3c184654cb5d65682ae.tar.gz tinycc-71b622096334e5cb90efd3c184654cb5d65682ae.tar.bz2 | |
tccgen: return: avoid jmp to retsym if possible
When 'return' is the last statement of the top-level block
(very common and often recommended case) jump is not needed.
| -rw-r--r-- | tccgen.c | 6 |
1 files changed, 5 insertions, 1 deletions
@@ -4922,7 +4922,9 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, skip(')'); a = gvtst(1, 0); b = 0; + ++local_scope; block(&a, &b, case_sym, def_sym, case_reg, 0); + --local_scope; if(!nocode_wanted) gjmp_addr(d); gsym(a); @@ -5060,7 +5062,9 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, vtop--; /* NOT vpop() because on x86 it would flush the fp stack */ } skip(';'); - rsym = gjmp(rsym); /* jmp */ + /* jump unless last stmt in top-level block */ + if (tok != '}' || local_scope != 1) + rsym = gjmp(rsym); } else if (tok == TOK_BREAK) { /* compute jump */ if (!bsym) |
