summaryrefslogtreecommitdiff
path: root/ir.c
diff options
context:
space:
mode:
authorWormHeamer2025-08-07 23:26:45 -0400
committerWormHeamer2025-08-07 23:26:45 -0400
commitff9dc0a669474afab22765f0daa91fe89afb40e5 (patch)
tree404cfccc8b39f506a65b00a55378d7abd41d239f /ir.c
parent027b6d8f62281f5b513a2b7bfcc02ea833c2cfd2 (diff)
hopefully make multiple returns form sensible graphs
Diffstat (limited to 'ir.c')
-rw-r--r--ir.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/ir.c b/ir.c
index a9fcd44..3ed9535 100644
--- a/ir.c
+++ b/ir.c
@@ -722,8 +722,17 @@ zero_no_effect: if (node_eql_i64(CAR(n), 0)) return CDR(n);
}
break;
+ case N_RETURN:
+ if (CTRL(n)->val.type.lvl == T_XCTRL) return CTRL(n);
+ break;
+
case N_PROJ:
if (T(CTRL(n), N_IF_ELSE) && CTRL(n)->val.type.t == T_TUPLE) {
+ if (CTRL(n)->val.tuple.data[n->val.i].type.lvl == T_XCTRL) {
+ return node_new_lit(p, (Value) {
+ .type = { .lvl = T_XCTRL, .t = T_NONE }
+ });
+ }
if (CTRL(n)->val.tuple.data[(n->val.i + 1) % CTRL(n)->val.tuple.len].type.lvl == T_XCTRL) {
return CTRL(CTRL(n));
}
@@ -736,6 +745,27 @@ zero_no_effect: if (node_eql_i64(CAR(n), 0)) return CDR(n);
if (IN(CTRL(n), 0)->val.type.lvl == T_XCTRL) return CDR(n);
break;
+ case N_REGION:
+ {
+ int live_in = 0;
+ for (int i = 0; i < n->in.len; i++) {
+ if (IN(n, i)->val.type.lvl != T_XCTRL) live_in++;
+ }
+ if (live_in == 1) {
+ for (int i = 0; i < n->in.len; i++) {
+ if (IN(n, i)->val.type.lvl != T_XCTRL) {
+ return IN(n, i);
+ }
+ }
+ }
+ if (live_in == 0) {
+ return node_new_lit(p, (Value) {
+ .type = { .lvl = T_XCTRL, .t = T_NONE }
+ });
+ }
+ }
+ break;
+
default:
break;
}