From ff9dc0a669474afab22765f0daa91fe89afb40e5 Mon Sep 17 00:00:00 2001 From: WormHeamer Date: Thu, 7 Aug 2025 23:26:45 -0400 Subject: hopefully make multiple returns form sensible graphs --- ir.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'ir.c') 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; } -- cgit v1.2.3