diff options
| author | WormHeamer | 2025-08-07 23:26:45 -0400 |
|---|---|---|
| committer | WormHeamer | 2025-08-07 23:26:45 -0400 |
| commit | ff9dc0a669474afab22765f0daa91fe89afb40e5 (patch) | |
| tree | 404cfccc8b39f506a65b00a55378d7abd41d239f /ir.c | |
| parent | 027b6d8f62281f5b513a2b7bfcc02ea833c2cfd2 (diff) | |
hopefully make multiple returns form sensible graphs
Diffstat (limited to 'ir.c')
| -rw-r--r-- | ir.c | 30 |
1 files changed, 30 insertions, 0 deletions
@@ -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; } |
