]> Nishi Git Mirror - gwion.git/commitdiff
:art: dead code elimination
authorfennecdjay <fennecdjay@gmail.com>
Fri, 28 Oct 2022 02:45:55 +0000 (04:45 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Fri, 28 Oct 2022 02:45:55 +0000 (04:45 +0200)
src/parse/scan1.c

index aad34f27507a707919d352f39c3b3c57f452a149..89ce37987b6d6fde7bba40166262b8f008a9f3f5 100644 (file)
@@ -539,12 +539,29 @@ ANN static inline m_bool scan1_stmt(const Env env, const Stmt stmt) {
   return scan1_stmt_func[stmt->stmt_type](env, &stmt->d);
 }
 
+ANN static inline bool end_flow(Stmt s) {
+  const ae_stmt_t t = s->stmt_type;
+    return t == ae_stmt_continue ||
+           t == ae_stmt_break    ||
+           t == ae_stmt_return;
+}
+
+ANN static void dead_code(const Env env, Stmt_List l, uint32_t len) {
+  for(uint32_t i = len; i < l->len; i++) {
+    const Stmt s = mp_vector_at(l, struct Stmt_, i);
+    free_stmt(env->gwion->mp, s);
+  }
+  l->len = len;
+}
+
 ANN static m_bool scan1_stmt_list(const Env env, Stmt_List l) {
   uint32_t i;
   for(i = 0; i < l->len; i++) {
     const Stmt s = mp_vector_at(l, struct Stmt_, i);
     CHECK_BB(scan1_stmt(env, s));
+    if(end_flow(s)) break;
   }
+  if(++i < l->len) dead_code(env, l, i);
   return GW_OK;
 }