summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2012-06-14 20:53:23 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2012-06-14 20:53:23 -0400
commitfa985580edb43442934e82cd622cf17612a19cfa (patch)
treeeb68768225ff3139760f08184e8d13405ad4dc60
parentf4ea5f02a91389431d96bbfabbcd60326d69df7d (diff)
Run offset pass before optimizer
Then only squash dyn_label + dyn_goto if the label definition is at the same level as the label expression.
-rw-r--r--examples/callcc.nl3
-rw-r--r--main.c4
-rw-r--r--optimize.c4
3 files changed, 6 insertions, 5 deletions
diff --git a/examples/callcc.nl b/examples/callcc.nl
index 19c6292..7bb299a 100644
--- a/examples/callcc.nl
+++ b/examples/callcc.nl
@@ -14,8 +14,7 @@ call_cc (fun: fn(k: continuation_t) -> void) -> int32
return 10;
@current_continuation:
- print "wat";
- print retval;
+ print "wat", retval;
return retval;
}
diff --git a/main.c b/main.c
index f0309ad..6140f62 100644
--- a/main.c
+++ b/main.c
@@ -58,10 +58,10 @@ compile (const char *input, gboolean do_optimize)
if (!return_check (ast))
return NULL;
- if (do_optimize && !optimize (ast))
+ if (!offsets (ast))
return NULL;
- if (!offsets (ast))
+ if (do_optimize && !optimize (ast))
return NULL;
return ast;
diff --git a/optimize.c b/optimize.c
index df72d56..619f19b 100644
--- a/optimize.c
+++ b/optimize.c
@@ -327,7 +327,9 @@ peephole (node_t *node,
*changed = TRUE;
}
else if (node_is (node0, NODE_DYN_LABEL) &&
- node_is (node1, NODE_DYN_GOTO))
+ node_is (node1, NODE_DYN_GOTO) &&
+ node0->dyn_label.expression->common.level ==
+ node0->dyn_label.definition->level)
{
node_new_goto (
node0->dyn_label.label, node0, NULL);