diff --git a/.gitignore b/.gitignore index d6444be..51b4b7b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build.exe build.slowdb venv/ *.plist +tests/*.asm diff --git a/ir/ir.c b/ir/ir.c index 1cc6a43..8a50508 100644 --- a/ir/ir.c +++ b/ir/ir.c @@ -286,7 +286,7 @@ vx_IrVar vx_IrBlock_newVar(vx_IrBlock *block, vx_IrOp *decl) { vx_IrBlock *root = (vx_IrBlock *) vx_IrBlock_root(block); assert(root != NULL); vx_IrVar new = root->as_root.vars_len; - vx_IrBlock_putVar(root, new, decl); + vx_IrBlock_putVar(root, new, decl); return new; } @@ -399,14 +399,10 @@ int vx_CU_compile(vx_CU * cu, vx_CIrBlock_fix(cu, block); // TODO: why... vx_CIrBlock_normalize(cu, block); - vx_IrBlock_dump(block, stdout, 0); vx_CIrBlock_mksa_states(cu, block); - vx_IrBlock_dump(block, stdout, 0); vx_CIrBlock_mksa_final(cu, block); - vx_IrBlock_dump(block, stdout, 0); vx_CIrBlock_fix(cu, block); // TODO: why... - vx_IrBlock_dump(block, stdout, 0); if (vx_ir_verify(cu, block) != 0) return 1; }); diff --git a/ir/transform/ll_if_invert.c b/ir/transform/ll_if_invert.c index 6d242b5..67cdaad 100644 --- a/ir/transform/ll_if_invert.c +++ b/ir/transform/ll_if_invert.c @@ -22,7 +22,7 @@ void vx_IrBlock_ll_if_invert(vx_CU* cu, vx_IrBlock *block) } vx_IrValue cond_val = *vx_IrOp_param(op, VX_IR_NAME_COND); - assert(cond_val.type = VX_IR_VAL_BLOCK); + assert(cond_val.type != VX_IR_VAL_BLOCK); if (then && !els) { diff --git a/ir/transform/lower_loops.c b/ir/transform/lower_loops.c index ba4089c..c9b366d 100644 --- a/ir/transform/lower_loops.c +++ b/ir/transform/lower_loops.c @@ -38,11 +38,13 @@ void vx_IrBlock_llir_preLower_loops(vx_CU* cu, vx_IrBlock *block) cond->ins = NULL; cond->ins_len = 0; + vx_IrBlock_addAllOp(newBody, cond); + vx_IrOp* ifOp = vx_IrBlock_addOpBuilding(newBody); vx_IrOp_init(ifOp, VX_IR_OP_IF, newBody); body->parent = ifOp->parent; - vx_IrOp_addParam_s(ifOp, VX_IR_NAME_COND, VX_IR_VALUE_BLK(cond)); + vx_IrOp_addParam_s(ifOp, VX_IR_NAME_COND, VX_IR_VALUE_VAR(cond->outs[0])); body->parent = ifOp->parent; vx_IrOp_addParam_s(ifOp, VX_IR_NAME_COND_THEN, VX_IR_VALUE_BLK(body)); diff --git a/ir/transform/ssair_llir_lower.c b/ir/transform/ssair_llir_lower.c index cbaaa4d..2caf48f 100644 --- a/ir/transform/ssair_llir_lower.c +++ b/ir/transform/ssair_llir_lower.c @@ -116,9 +116,7 @@ static void lower_into(vx_IrBlock *old, vx_IrBlock *dest, vx_IrBlock *newParent, } vx_IrValue cond_val = *vx_IrOp_param(op, VX_IR_NAME_COND); - assert(cond_val.type = VX_IR_VAL_BLOCK); - - // lower_into(cond, dest, newParent, continueLabel, breakLabel, loopOP); + assert(cond_val.type != VX_IR_VAL_BLOCK); if (els && then) { // cond .then COND diff --git a/s-expr/ir_serial.c b/s-expr/ir_serial.c index 4baa50c..7e5a77c 100644 --- a/s-expr/ir_serial.c +++ b/s-expr/ir_serial.c @@ -155,6 +155,7 @@ vx_IrBlock* vx_IrBlock_parseS(vx_CU* cu, struct SNode* s) struct SNode* rets = snode_expect(snode_kv_get_expect(s, "rets"), S_LIST)->list; vx_IrBlock* block = vx_IrBlock_initHeap(NULL, NULL); + block->is_root = false; for (; args; args = args->next) { vx_IrTypedVar arg = vx_IrTypedVar_parseS(cu, args); @@ -165,6 +166,12 @@ vx_IrBlock* vx_IrBlock_parseS(vx_CU* cu, struct SNode* s) vx_IrOp* op = vx_IrOp_parseS(cu, ops); op->parent = block; vx_IrBlock_addOp(block, op); + + FOR_INPUTS(op, inp, ({ + if (inp.type == VX_IR_VAL_BLOCK) { + inp.block->parent = block; + } + })); } for (; rets; rets = rets->next) { @@ -207,7 +214,7 @@ void vx_CUBlock_parseS(vx_CU* cu, struct SNode* s) inner = inner->next; vx_IrBlock* block = vx_IrBlock_parseS(cu, inner); - vx_IrBlock_makeRoot(block, 0); + block->is_root = true; vx_CIrBlock_fix(cu, block); char const* name = snode_expect(snode_kv_get_expect(attribs, "name"), S_STRING)->value; diff --git a/tests/c3_to_ir.sh b/tests/c3_to_ir.sh old mode 100644 new mode 100755 diff --git a/tests/ir_to_asm.sh b/tests/ir_to_asm.sh new file mode 100755 index 0000000..37f42b9 --- /dev/null +++ b/tests/ir_to_asm.sh @@ -0,0 +1,4 @@ +set -e +for f in *.s; do + ../build/vxcc.exe vs2asm --in=$f > $f.asm +done