os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit 26ac1fd10134d21b5b6d8dffccbd77b85535d71a
parent 2b8b7145c0c1f5473f7d927b9285f6c8e6a2a262
Author: erai <erai@omiltem.net>
Date:   Fri,  7 Feb 2025 19:03:03 +0000

combine cout and out

Diffstat:
Mbootstrap.sh | 5+----
Mcc0.c | 435+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mcc1.om | 31+++++++++++++++----------------
Mir.om | 37++++++++++++++++++++++++++++++++++++-
4 files changed, 299 insertions(+), 209 deletions(-)

diff --git a/bootstrap.sh b/bootstrap.sh @@ -10,9 +10,6 @@ SOURCES="cc1.om type.om parse2.om parse3.om peglib.om as.om decl.om node.om peg. ./cc0 ${LIBS} ${SOURCES} -o cc1 -n cc1.lines -G cc1.call # Double check the bootstrap and self hosting compiler have the same output -./cc1 ${LIBS} ${SOURCES} -o cc2 -n cc2.lines -G cc2.call +./cc1 ${LIBS} ${SOURCES} -C cc2.c -o cc2 -n cc2.lines -G cc2.call cmp cc1 cc2 || echo cc mismatch - -# Verify the saved bootstrap matches -./cc1 -C ${LIBS} ${SOURCES} -o cc2.c cmp cc0.c cc2.c || echo bootstrap mismatch diff --git a/cc0.c b/cc0.c @@ -91,6 +91,7 @@ u my_irblock_dead_expr(u v_ic, u v_b); u my_irblock_flow2(u v_ic, u v_ib); u my_irblock_flow3(u v_ic, u v_ib); u my_irblock_fold(u v_ic, u v_b); +u my_irblock_value(u v_ic, u v_ib); u my_irbranch(u v_ic, u v_cond, u v_alt, u v_next); u my_ircall(u v_ic, u v_n); u my_ircargs(u v_c, u v_ic, u v_ib, u v_n); @@ -113,6 +114,7 @@ u my_irfind_var(u v_ic, u v_name); u my_irfunc_dead(u v_ic); u my_irfunc_flow(u v_ic); u my_irfunc_fold(u v_ic); +u my_irfunc_value(u v_ic); u my_irjump(u v_ic, u v_to, u v_next); u my_irreset(u v_b); u my_irreturn(u v_ic, u v_value); @@ -15565,6 +15567,18 @@ u my_ir_optimize(u v_ic) { u v7 = 0; u v8 = 0; u v9 = 0; + u v10 = 0; + u v11 = 0; + u v12 = 0; + u v13 = 0; + u v14 = 0; + u v15 = 0; + u v16 = 0; + u v17 = 0; + u v18 = 0; + u v19 = 0; + u v20 = 0; + u v21 = 0; b0: v1 = (u)my_irfunc_dead; v2 = v_ic; v3 = ((u (*)())(v1))(v2); @@ -15574,7 +15588,19 @@ b1: v4 = (u)my_irfunc_fold; b2: v7 = (u)my_irfunc_flow; v8 = v_ic; v9 = ((u (*)())(v7))(v8); -b3: return 0UL; +b3: v10 = (u)my_irfunc_value; + v11 = v_ic; + v12 = ((u (*)())(v10))(v11); +b4: v13 = (u)my_irfunc_dead; + v14 = v_ic; + v15 = ((u (*)())(v13))(v14); +b5: v16 = (u)my_irfunc_fold; + v17 = v_ic; + v18 = ((u (*)())(v16))(v17); +b6: v19 = (u)my_irfunc_flow; + v20 = v_ic; + v21 = ((u (*)())(v19))(v20); +b7: return 0UL; } u my_iraddarg(u v_ic, u v_name, u v_t) { u v_iv = 0; @@ -15976,6 +16002,15 @@ b12: v_o = v9; b5: v5 = 1UL; goto b6; } +u my_irblock_value(u v_ic, u v_ib) { + u v_i = 0; +b0: v_i = 0UL; + goto b1; +b1: if (!((u)(((s)(v_i)) == ((s)(*(u *)((v_ib) + (16UL))))))) { goto b3; } +b2: return 0UL; +b3: v_i = (v_i) + (1UL); + goto b1; +} u my_irbranch(u v_ic, u v_cond, u v_alt, u v_next) { u v_cur = 0; u v_o = 0; @@ -19873,6 +19908,23 @@ b3: v2 = (u)my_irblock_fold; b6: v_i = (v_i) + (1UL); goto b1; } +u my_irfunc_value(u v_ic) { + u v_i = 0; + u v2 = 0; + u v3 = 0; + u v4 = 0; + u v5 = 0; +b0: v_i = 0UL; + goto b1; +b1: if (!((u)(((s)(v_i)) == ((s)(*(u *)((v_ic) + (48UL))))))) { goto b3; } +b2: return 0UL; +b3: v2 = (u)my_irblock_value; + v3 = v_ic; + v4 = *(u *)((*(u *)((v_ic) + (40UL))) + ((v_i) * (8UL))); + v5 = ((u (*)())(v2))(v3, v4); +b6: v_i = (v_i) + (1UL); + goto b1; +} u my_irjump(u v_ic, u v_to, u v_next) { u v_cur = 0; u v_o = 0; @@ -20428,13 +20480,13 @@ u my_main(u v_argc, u v_argv, u v_envp) { u v_p = 0; u v_i = 0; u v_show = 0; - u v_filename = 0; + u v_out_filename = 0; + u v_cout_filename = 0; u v_err = 0; u v_input = 0; u v_tmp = 0; u v_link = 0; u v_peg = 0; - u v14 = 0; u v15 = 0; u v16 = 0; u v17 = 0; @@ -20556,226 +20608,233 @@ u my_main(u v_argc, u v_argv, u v_envp) { u v133 = 0; u v134 = 0; u v135 = 0; + u v136 = 0; + u v137 = 0; + u v138 = 0; + u v139 = 0; b0: v_link = (u)&v_input; - v14 = (u)my_setup_alloc; - v15 = (u)&v_a; - v16 = ((u (*)())(v14))(v15); -b1: v17 = (u)my_fopen; - v18 = 2UL; - v19 = (u)&v_a; - v20 = ((u (*)())(v17))(v18, v19); -b2: v_err = v20; - v21 = (u)my_comp_setup; - v22 = (u)&v_a; - v23 = v_err; - v24 = ((u (*)())(v21))(v22, v23); -b3: v_c = v24; - v_show = 0UL; - v_filename = (u)"a.out"; + v15 = (u)my_setup_alloc; + v16 = (u)&v_a; + v17 = ((u (*)())(v15))(v16); +b1: v18 = (u)my_fopen; + v19 = 2UL; + v20 = (u)&v_a; + v21 = ((u (*)())(v18))(v19, v20); +b2: v_err = v21; + v22 = (u)my_comp_setup; + v23 = (u)&v_a; + v24 = v_err; + v25 = ((u (*)())(v22))(v23, v24); +b3: v_c = v25; v_i = 1UL; goto b4; b4: if (!((u)(((s)(v_i)) >= ((s)(v_argc))))) { goto b6; } -b5: if (!(v_peg)) { goto b71; } -b72: if (!(v_input)) { goto b78; } -b77: v82 = 0UL; - goto b79; -b79: if (!(v82)) { goto b74; } -b75: v83 = (u)my_die; - v84 = (u)"expected input"; - v85 = ((u (*)())(v83))(v84); -b74: v86 = (u)my_peg_open_output; - v87 = v_peg; - v88 = v_filename; - v89 = ((u (*)())(v86))(v87, v88); -b81: v_tmp = v_input; - goto b82; -b82: if (!(v_tmp)) { goto b88; } -b87: v90 = 0UL; - goto b89; -b89: if (!(v90)) { goto b84; } -b83: return 0UL; -b84: v91 = (u)my_peg_compile; - v92 = v_peg; - v93 = *(u *)((v_tmp) + (8UL)); - v94 = v_err; - v95 = ((u (*)())(v91))(v92, v93, v94); -b90: v_tmp = *(u *)(v_tmp); - goto b82; -b88: v90 = 1UL; - goto b89; -b78: v82 = 1UL; - goto b79; -b71: v_tmp = v_input; - goto b91; -b91: if (!(v_tmp)) { goto b97; } -b96: v96 = 0UL; - goto b98; -b98: if (!(v96)) { goto b93; } -b92: if (!(v_show)) { goto b101; } -b102: v106 = (u)my_show_node; - v107 = v_err; - v108 = v_p; - v109 = ((u (*)())(v106))(v107, v108); -b104: v110 = (u)my_fflush; +b5: if (!(v_peg)) { goto b75; } +b76: if (!(v_input)) { goto b82; } +b81: v86 = 0UL; + goto b83; +b83: if (!(v86)) { goto b78; } +b79: v87 = (u)my_die; + v88 = (u)"expected input"; + v89 = ((u (*)())(v87))(v88); +b78: v90 = (u)my_peg_open_output; + v91 = v_peg; + v92 = v_out_filename; + v93 = ((u (*)())(v90))(v91, v92); +b85: v_tmp = v_input; + goto b86; +b86: if (!(v_tmp)) { goto b92; } +b91: v94 = 0UL; + goto b93; +b93: if (!(v94)) { goto b88; } +b87: return 0UL; +b88: v95 = (u)my_peg_compile; + v96 = v_peg; + v97 = *(u *)((v_tmp) + (8UL)); + v98 = v_err; + v99 = ((u (*)())(v95))(v96, v97, v98); +b94: v_tmp = *(u *)(v_tmp); + goto b86; +b92: v94 = 1UL; + goto b93; +b82: v86 = 1UL; + goto b83; +b75: v_tmp = v_input; + goto b95; +b95: if (!(v_tmp)) { goto b101; } +b100: v100 = 0UL; + goto b102; +b102: if (!(v100)) { goto b97; } +b96: if (!(v_show)) { goto b105; } +b106: v110 = (u)my_show_node; v111 = v_err; - v112 = ((u (*)())(v110))(v111); -b105: return 0UL; -b101: v113 = (u)my_compile; - v114 = v_c; - v115 = v_p; - v116 = ((u (*)())(v113))(v114, v115); -b106: if (!(*(u *)((v_c) + (64UL)))) { goto b107; } -b108: v117 = (u)my_open_coutput; + v112 = v_p; + v113 = ((u (*)())(v110))(v111, v112); +b108: v114 = (u)my_fflush; + v115 = v_err; + v116 = ((u (*)())(v114))(v115); +b109: return 0UL; +b105: v117 = (u)my_compile; v118 = v_c; - v119 = v_filename; + v119 = v_p; v120 = ((u (*)())(v117))(v118, v119); -b110: v121 = (u)my_ircout; +b110: if (!(v_cout_filename)) { goto b111; } +b112: v121 = (u)my_open_coutput; v122 = v_c; - v123 = ((u (*)())(v121))(v122); -b111: return 0UL; -b107: v124 = (u)my_emit_builtin; - v125 = v_c; - v126 = ((u (*)())(v124))(v125); -b112: v127 = (u)my_open_output; - v128 = *(u *)((v_c) + (48UL)); - v129 = v_filename; - v130 = ((u (*)())(v127))(v128, v129); -b113: v131 = (u)my_writeout; + v123 = v_cout_filename; + v124 = ((u (*)())(v121))(v122, v123); +b114: v125 = (u)my_ircout; + v126 = v_c; + v127 = ((u (*)())(v125))(v126); +b111: v128 = (u)my_emit_builtin; + v129 = v_c; + v130 = ((u (*)())(v128))(v129); +b116: if (!(v_out_filename)) { goto b117; } +b118: v131 = (u)my_open_output; v132 = *(u *)((v_c) + (48UL)); - v133 = *(u *)((v_c) + (88UL)); - v134 = *(u *)((v_c) + (96UL)); - v135 = ((u (*)())(v131))(v132, v133, v134); -b114: return 0UL; -b93: v97 = (u)my_concat_program; - v98 = v_p; - v100 = (u)my_parse; - v101 = *(u *)((v_c) + (16UL)); - v102 = *(u *)((v_tmp) + (8UL)); - v103 = v_err; - v104 = ((u (*)())(v100))(v101, v102, v103); -b99: v99 = v104; - v105 = ((u (*)())(v97))(v98, v99); -b100: v_p = v105; + v133 = v_out_filename; + v134 = ((u (*)())(v131))(v132, v133); +b120: v135 = (u)my_writeout; + v136 = *(u *)((v_c) + (48UL)); + v137 = *(u *)((v_c) + (88UL)); + v138 = *(u *)((v_c) + (96UL)); + v139 = ((u (*)())(v135))(v136, v137, v138); +b117: return 0UL; +b97: v101 = (u)my_concat_program; + v102 = v_p; + v104 = (u)my_parse; + v105 = *(u *)((v_c) + (16UL)); + v106 = *(u *)((v_tmp) + (8UL)); + v107 = v_err; + v108 = ((u (*)())(v104))(v105, v106, v107); +b103: v103 = v108; + v109 = ((u (*)())(v101))(v102, v103); +b104: v_p = v109; v_tmp = *(u *)(v_tmp); - goto b91; -b97: v96 = 1UL; - goto b98; -b6: v26 = (u)my_strcmp; - v27 = *(u *)((v_argv) + ((v_i) * (8UL))); - v28 = (u)"-o"; - v29 = ((u (*)())(v26))(v27, v28); -b15: if (!(v29)) { goto b13; } -b12: v25 = 0UL; + goto b95; +b101: v100 = 1UL; + goto b102; +b6: v27 = (u)my_strcmp; + v28 = *(u *)((v_argv) + ((v_i) * (8UL))); + v29 = (u)"-o"; + v30 = ((u (*)())(v27))(v28, v29); +b15: if (!(v30)) { goto b13; } +b12: v26 = 0UL; goto b14; -b14: if (!(v25)) { goto b9; } +b14: if (!(v26)) { goto b9; } b10: v_i = (v_i) + (1UL); if (!((u)(((s)(v_i)) >= ((s)(v_argc))))) { goto b16; } -b17: v30 = (u)my_die; - v31 = (u)"invalid -o at end of argument list"; - v32 = ((u (*)())(v30))(v31); -b16: v_filename = *(u *)((v_argv) + ((v_i) * (8UL))); +b17: v31 = (u)my_die; + v32 = (u)"invalid -o at end of argument list"; + v33 = ((u (*)())(v31))(v32); +b16: v_out_filename = *(u *)((v_argv) + ((v_i) * (8UL))); v_i = (v_i) + (1UL); goto b4; -b9: v34 = (u)my_strcmp; - v35 = *(u *)((v_argv) + ((v_i) * (8UL))); - v36 = (u)"-fdump"; - v37 = ((u (*)())(v34))(v35, v36); -b26: if (!(v37)) { goto b24; } -b23: v33 = 0UL; +b9: v35 = (u)my_strcmp; + v36 = *(u *)((v_argv) + ((v_i) * (8UL))); + v37 = (u)"-fdump"; + v38 = ((u (*)())(v35))(v36, v37); +b26: if (!(v38)) { goto b24; } +b23: v34 = 0UL; goto b25; -b25: if (!(v33)) { goto b20; } +b25: if (!(v34)) { goto b20; } b21: v_i = (v_i) + (1UL); v_show = 1UL; goto b4; -b20: v39 = (u)my_strcmp; - v40 = *(u *)((v_argv) + ((v_i) * (8UL))); - v41 = (u)"-C"; - v42 = ((u (*)())(v39))(v40, v41); -b33: if (!(v42)) { goto b31; } -b30: v38 = 0UL; +b20: v40 = (u)my_strcmp; + v41 = *(u *)((v_argv) + ((v_i) * (8UL))); + v42 = (u)"-C"; + v43 = ((u (*)())(v40))(v41, v42); +b33: if (!(v43)) { goto b31; } +b30: v39 = 0UL; goto b32; -b32: if (!(v38)) { goto b27; } -b28: *(u *)((v_c) + (64UL)) = 1UL; +b32: if (!(v39)) { goto b27; } +b28: v_i = (v_i) + (1UL); + if (!((u)(((s)(v_i)) >= ((s)(v_argc))))) { goto b34; } +b35: v44 = (u)my_die; + v45 = (u)"invalid -o at end of argument list"; + v46 = ((u (*)())(v44))(v45); +b34: v_cout_filename = *(u *)((v_argv) + ((v_i) * (8UL))); v_i = (v_i) + (1UL); goto b4; -b27: v44 = (u)my_strcmp; - v45 = *(u *)((v_argv) + ((v_i) * (8UL))); - v46 = (u)"-G"; - v47 = ((u (*)())(v44))(v45, v46); -b40: if (!(v47)) { goto b38; } -b37: v43 = 0UL; - goto b39; -b39: if (!(v43)) { goto b34; } -b35: v_i = (v_i) + (1UL); - if (!((u)(((s)(v_i)) >= ((s)(v_argc))))) { goto b41; } -b42: v48 = (u)my_die; - v49 = (u)"invalid -P at end of argument list"; - v50 = ((u (*)())(v48))(v49); -b41: v51 = (u)my_open_call_out; - v52 = v_c; - v53 = *(u *)((v_argv) + ((v_i) * (8UL))); - v54 = ((u (*)())(v51))(v52, v53); -b45: v_i = (v_i) + (1UL); - goto b4; -b34: v56 = (u)my_strcmp; +b27: v48 = (u)my_strcmp; + v49 = *(u *)((v_argv) + ((v_i) * (8UL))); + v50 = (u)"-G"; + v51 = ((u (*)())(v48))(v49, v50); +b44: if (!(v51)) { goto b42; } +b41: v47 = 0UL; + goto b43; +b43: if (!(v47)) { goto b38; } +b39: v_i = (v_i) + (1UL); + if (!((u)(((s)(v_i)) >= ((s)(v_argc))))) { goto b45; } +b46: v52 = (u)my_die; + v53 = (u)"invalid -P at end of argument list"; + v54 = ((u (*)())(v52))(v53); +b45: v55 = (u)my_open_call_out; + v56 = v_c; v57 = *(u *)((v_argv) + ((v_i) * (8UL))); - v58 = (u)"-n"; - v59 = ((u (*)())(v56))(v57, v58); -b52: if (!(v59)) { goto b50; } -b49: v55 = 0UL; - goto b51; -b51: if (!(v55)) { goto b46; } -b47: v_i = (v_i) + (1UL); - if (!((u)(((s)(v_i)) >= ((s)(v_argc))))) { goto b53; } -b54: v60 = (u)my_die; - v61 = (u)"invalid -P at end of argument list"; - v62 = ((u (*)())(v60))(v61); -b53: v63 = (u)my_open_lines_out; - v64 = v_c; - v65 = *(u *)((v_argv) + ((v_i) * (8UL))); - v66 = ((u (*)())(v63))(v64, v65); -b57: v_i = (v_i) + (1UL); + v58 = ((u (*)())(v55))(v56, v57); +b49: v_i = (v_i) + (1UL); goto b4; -b46: v68 = (u)my_strcmp; +b38: v60 = (u)my_strcmp; + v61 = *(u *)((v_argv) + ((v_i) * (8UL))); + v62 = (u)"-n"; + v63 = ((u (*)())(v60))(v61, v62); +b56: if (!(v63)) { goto b54; } +b53: v59 = 0UL; + goto b55; +b55: if (!(v59)) { goto b50; } +b51: v_i = (v_i) + (1UL); + if (!((u)(((s)(v_i)) >= ((s)(v_argc))))) { goto b57; } +b58: v64 = (u)my_die; + v65 = (u)"invalid -P at end of argument list"; + v66 = ((u (*)())(v64))(v65); +b57: v67 = (u)my_open_lines_out; + v68 = v_c; v69 = *(u *)((v_argv) + ((v_i) * (8UL))); - v70 = (u)"-P"; - v71 = ((u (*)())(v68))(v69, v70); -b64: if (!(v71)) { goto b62; } -b61: v67 = 0UL; - goto b63; -b63: if (!(v67)) { goto b58; } -b59: v72 = (u)my_setup_peg; - v73 = (u)&v_a; - v74 = ((u (*)())(v72))(v73); -b65: v_peg = v74; + v70 = ((u (*)())(v67))(v68, v69); +b61: v_i = (v_i) + (1UL); + goto b4; +b50: v72 = (u)my_strcmp; + v73 = *(u *)((v_argv) + ((v_i) * (8UL))); + v74 = (u)"-P"; + v75 = ((u (*)())(v72))(v73, v74); +b68: if (!(v75)) { goto b66; } +b65: v71 = 0UL; + goto b67; +b67: if (!(v71)) { goto b62; } +b63: v76 = (u)my_setup_peg; + v77 = (u)&v_a; + v78 = ((u (*)())(v76))(v77); +b69: v_peg = v78; v_i = (v_i) + (1UL); goto b4; -b58: if (!((u)(((s)((u)*(b *)(*(u *)((v_argv) + ((v_i) * (8UL)))))) == ((s)(45UL))))) { goto b66; } -b67: v75 = (u)my_die; - v76 = (u)"invalid argument"; - v77 = ((u (*)())(v75))(v76); -b66: v78 = (u)my_alloc; - v79 = (u)&v_a; - v80 = 16UL; - v81 = ((u (*)())(v78))(v79, v80); -b70: v_tmp = v81; +b62: if (!((u)(((s)((u)*(b *)(*(u *)((v_argv) + ((v_i) * (8UL)))))) == ((s)(45UL))))) { goto b70; } +b71: v79 = (u)my_die; + v80 = (u)"invalid argument"; + v81 = ((u (*)())(v79))(v80); +b70: v82 = (u)my_alloc; + v83 = (u)&v_a; + v84 = 16UL; + v85 = ((u (*)())(v82))(v83, v84); +b74: v_tmp = v85; *(u *)(v_tmp) = 0UL; *(u *)((v_tmp) + (8UL)) = *(u *)((v_argv) + ((v_i) * (8UL))); *(u *)(v_link) = v_tmp; v_link = v_tmp; v_i = (v_i) + (1UL); goto b4; -b62: v67 = 1UL; - goto b63; -b50: v55 = 1UL; - goto b51; -b38: v43 = 1UL; - goto b39; -b31: v38 = 1UL; +b66: v71 = 1UL; + goto b67; +b54: v59 = 1UL; + goto b55; +b42: v47 = 1UL; + goto b43; +b31: v39 = 1UL; goto b32; -b24: v33 = 1UL; +b24: v34 = 1UL; goto b25; -b13: v25 = 1UL; +b13: v26 = 1UL; goto b14; } u my_mark_expr_used(u v_c, u v_d, u v_n) { diff --git a/cc1.om b/cc1.om @@ -2204,7 +2204,8 @@ func main(argc: int, argv: **byte, envp: **byte) { var p: *node; var i: int; var show: int; - var filename: *byte; + var out_filename: *byte; + var cout_filename: *byte; var err: *file; var input: *name_node; var tmp: *name_node; @@ -2219,10 +2220,6 @@ func main(argc: int, argv: **byte, envp: **byte) { c = comp_setup(&a, err); - show = 0; - - filename = "a.out"; - i = 1; loop { if (i >= argc) { @@ -2234,7 +2231,7 @@ func main(argc: int, argv: **byte, envp: **byte) { if (i >= argc) { die("invalid -o at end of argument list"); } - filename = argv[i]; + out_filename = argv[i]; i = i + 1; continue; } @@ -2246,7 +2243,11 @@ func main(argc: int, argv: **byte, envp: **byte) { } if (!strcmp(argv[i], "-C")) { - c.do_cout = 1; + i = i + 1; + if (i >= argc) { + die("invalid -o at end of argument list"); + } + cout_filename = argv[i]; i = i + 1; continue; } @@ -2294,7 +2295,7 @@ func main(argc: int, argv: **byte, envp: **byte) { if !input { die("expected input"); } - peg_open_output(peg, filename); + peg_open_output(peg, out_filename); tmp = input; loop { if !tmp { @@ -2323,17 +2324,15 @@ func main(argc: int, argv: **byte, envp: **byte) { compile(c, p); - if c.do_cout { - open_coutput(c, filename); - + if cout_filename { + open_coutput(c, cout_filename); ircout(c); - - return; } emit_builtin(c); - open_output(c.s, filename); - - writeout(c.s, c.start, c.kstart); + if out_filename { + open_output(c.s, out_filename); + writeout(c.s, c.start, c.kstart); + } } diff --git a/ir.om b/ir.om @@ -2507,11 +2507,46 @@ func irfunc_fold(ic: *irfunc) { i = i + 1; } +} + +func irblock_value(ic: *irfunc, ib: *irblock) { + var i: int; + + i = 0; + loop { + if i == ib.ops_len { + break; + } + + i = i + 1; + } +} + +func irfunc_value(ic: *irfunc) { + var i: int; + // Forward simple stores to their use + i = 0; + loop { + if i == ic.blocks_len { + break; + } + + irblock_value(ic, ic.blocks[i]); + + i = i + 1; + } } func ir_optimize(ic: *irfunc) { - // Do the easy simplifications first + // Do the easy simplifications first. + irfunc_dead(ic); + irfunc_fold(ic); + irfunc_flow(ic); + + irfunc_value(ic); + + // Do them again. irfunc_dead(ic); irfunc_fold(ic); irfunc_flow(ic);