aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlas, Zdenek <zden3k@gmail.com>2016-08-11 04:59:08 -0700
committerPavlas, Zdenek <zden3k@gmail.com>2016-08-11 05:02:40 -0700
commit71b622096334e5cb90efd3c184654cb5d65682ae (patch)
tree6b43e8f55529661925425357ed7abf02618a3eea
parent0a402f6e91c284dd37cb61e726cc95de20fe895e (diff)
downloadtinycc-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.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/tccgen.c b/tccgen.c
index 5d92e5f..9ebd80a 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -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)