commit 26ac1fd10134d21b5b6d8dffccbd77b85535d71a
parent 2b8b7145c0c1f5473f7d927b9285f6c8e6a2a262
Author: erai <erai@omiltem.net>
Date: Fri, 7 Feb 2025 19:03:03 +0000
combine cout and out
Diffstat:
M | bootstrap.sh | | | 5 | +---- |
M | cc0.c | | | 435 | +++++++++++++++++++++++++++++++++++++++++++++---------------------------------- |
M | cc1.om | | | 31 | +++++++++++++++---------------- |
M | ir.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);