diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-06-14 20:53:23 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2012-06-14 20:53:23 -0400 |
commit | fa985580edb43442934e82cd622cf17612a19cfa (patch) | |
tree | eb68768225ff3139760f08184e8d13405ad4dc60 | |
parent | f4ea5f02a91389431d96bbfabbcd60326d69df7d (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.nl | 3 | ||||
-rw-r--r-- | main.c | 4 | ||||
-rw-r--r-- | optimize.c | 4 |
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; } @@ -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; @@ -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); |