commit c3f3291221fa9ce4314b6ee0067326e166d8efe8
parent 8c437ccf5bf48827620a07779665c2f94fdce6a5
Author: Brian Swetland <swetland@frotz.net>
Date: Mon, 6 Dec 2021 02:36:42 -0800
compiler2: more if/else fixes
We were not generating jumps from the end of the 'then' block
to the very end of the generated code in the event of following
'else' or 'ifelse' segments. Resolved.
Diffstat:
1 file changed, 15 insertions(+), 0 deletions(-)
diff --git a/src/codegen-risc5-simple.c b/src/codegen-risc5-simple.c
@@ -441,6 +441,10 @@ void gen_while(Ast node) {
}
void gen_if_else(Ast node) {
+ // fixups for jumps to the very end
+ FixupRec if_exit;
+ if_exit.next = nil;
+
gen_trace("gen_if()");
// IF contains one or more IFELSE nodes
node = node->c0;
@@ -458,6 +462,10 @@ void gen_if_else(Ast node) {
node = node->c2;
while (node != nil) {
+ // jump from end of 'then' block to end
+ gen_branch_fwd(EQ, &if_exit);
+
+ // patch false jump (over 'then' block) to here
fixup_branch_fwd(l0_br_false);
if (node->kind == AST_IFELSE) { // ifelse ...
@@ -472,11 +480,18 @@ void gen_if_else(Ast node) {
} else { // else ...
gen_trace("gen_else()");
gen_block(node);
+
+ // done, patch up earlier jumps to exit
+ fixup_branches_fwd(if_exit.next);
return;
}
}
+ // patch false jump (over previous 'then' block) to here
fixup_branch_fwd(l0_br_false);
+
+ // done, patch up earlier jumps to exit
+ fixup_branches_fwd(if_exit.next);
}
void gen_block(Ast node);