Skip to content

Commit

Permalink
kids remember to always zero initialize your allocations
Browse files Browse the repository at this point in the history
  • Loading branch information
alex-s168 committed Aug 20, 2024
1 parent 572570d commit 0d6318b
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 27 deletions.
5 changes: 3 additions & 2 deletions ir/builder.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ void vx_IrBlock_make_root(vx_IrBlock *block,
block->is_root = true;

block->as_root.vars_len = total_vars;
block->as_root.vars = malloc(sizeof(*block->as_root.vars) * total_vars);
block->as_root.vars = calloc(total_vars, sizeof(*block->as_root.vars));
for (size_t i = 0; i < total_vars; i ++) {
vx_IrOp *decl = find_var_decl(block, i);
if (decl == NULL) {
Expand Down Expand Up @@ -98,8 +98,9 @@ static void root_block_put_var(vx_IrBlock *root, vx_IrVar var, vx_IrOp *decl) {
assert(root->is_root);
if (var >= root->as_root.vars_len) {
root->as_root.vars = realloc(root->as_root.vars, sizeof(*root->as_root.vars) * (var + 1));
root->as_root.vars_len = var + 1;
root->as_root.vars_len = var + 1;
}
memset(&root->as_root.vars[var], 0, sizeof(*root->as_root.vars));
root->as_root.vars[var].decl = decl;
}

Expand Down
1 change: 1 addition & 0 deletions ir/ir.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ vx_IrVar vx_IrBlock_new_var(vx_IrBlock *block, vx_IrOp *decl) {
root->as_root.vars = realloc(root->as_root.vars, (root->as_root.vars_len + 1) * sizeof(*root->as_root.vars));
assert(root->as_root.vars);
vx_IrVar new = root->as_root.vars_len ++;
memset(&root->as_root.vars[new], 0, sizeof(*root->as_root.vars));
root->as_root.vars[new].decl = decl;
return new;
}
Expand Down
3 changes: 2 additions & 1 deletion ir/opt/cmov.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ static vx_IrVar block_res_as_var(vx_IrBlock *parent, vx_IrBlock *block) {
vx_IrOp_init(op, VX_IR_OP_FLATTEN_PLEASE, parent);
vx_IrVar dest = vx_IrBlock_new_var(parent, op);
vx_IrOp_add_param_s(op, VX_IR_NAME_BLOCK, (vx_IrValue) { .type = VX_IR_VAL_BLOCK, .block = block });
vx_IrType* type = vx_IrBlock_typeof_var(root, block->outs[0]);
assert(block->outs_len >= 1);
vx_IrType* type = vx_IrBlock_typeof_var(block, block->outs[0]);
assert(type);
vx_IrOp_add_out(op, dest, type);
return dest;
Expand Down
38 changes: 14 additions & 24 deletions test.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
static vx_IrType *ty_int;
static vx_IrType *ty_bool;

static vx_IrBlock *var_block(vx_IrBlock *parent, vx_IrVar var) {
vx_IrBlock *block = vx_IrBlock_init_heap(parent, parent->parent_op);
vx_IrBlock_add_out(block, var);
return block;
}

static vx_IrBlock *always_true_block(vx_IrBlock *parent, vx_IrVar temp_var) {
vx_IrBlock *block = vx_IrBlock_init_heap(parent, parent->parent_op);

Expand All @@ -20,25 +26,7 @@ static vx_IrBlock *always_true_block(vx_IrBlock *parent, vx_IrVar temp_var) {
return block;
}

static vx_IrBlock *conditional_c_assign(vx_IrVar dest, vx_IrBlock *parent, vx_IrVar temp_var) {
vx_IrOp *op = vx_IrBlock_add_op_building(parent);
vx_IrOp_init(op, VX_IR_OP_IF, parent);

vx_IrBlock *then = vx_IrBlock_init_heap(parent, parent->parent_op);
{
vx_IrOp *op2 = vx_IrBlock_add_op_building(then);
vx_IrOp_init(op2, VX_IR_OP_IMM, then);
vx_IrOp_add_out(op2, dest, ty_int);
vx_IrOp_add_param_s(op2, VX_IR_NAME_VALUE, (vx_IrValue) { .type = VX_IR_VAL_IMM_INT, .imm_int = 2 });
}
vx_IrOp_add_param_s(op, VX_IR_NAME_COND_THEN, (vx_IrValue) { .type = VX_IR_VAL_BLOCK, .block = then });

vx_IrOp_add_param_s(op, VX_IR_NAME_COND, (vx_IrValue) { .type = VX_IR_VAL_BLOCK, .block = always_true_block(parent, temp_var) });

return then;
}

static vx_IrBlock *conditional_c_assign_else(vx_IrVar dest, vx_IrBlock *parent, vx_IrVar temp_var) {
static vx_IrBlock *conditional_c_assign_else(vx_IrVar dest, vx_IrBlock *parent, long long value, vx_IrVar condVar) {
vx_IrOp *op = vx_IrBlock_add_op_building(parent);
vx_IrOp_init(op, VX_IR_OP_IF, parent);

Expand All @@ -49,11 +37,11 @@ static vx_IrBlock *conditional_c_assign_else(vx_IrVar dest, vx_IrBlock *parent,
vx_IrOp *op2 = vx_IrBlock_add_op_building(els);
vx_IrOp_init(op2, VX_IR_OP_IMM, els);
vx_IrOp_add_out(op2, dest, ty_int);
vx_IrOp_add_param_s(op2, VX_IR_NAME_VALUE, (vx_IrValue) { .type = VX_IR_VAL_IMM_INT, .imm_int = 2 });
vx_IrOp_add_param_s(op2, VX_IR_NAME_VALUE, (vx_IrValue) { .type = VX_IR_VAL_IMM_INT, .imm_int = value });
}
vx_IrOp_add_param_s(op, VX_IR_NAME_COND_ELSE, (vx_IrValue) { .type = VX_IR_VAL_BLOCK, .block = els });

vx_IrOp_add_param_s(op, VX_IR_NAME_COND, (vx_IrValue) { .type = VX_IR_VAL_BLOCK, .block = always_true_block(parent, temp_var) });
vx_IrOp_add_param_s(op, VX_IR_NAME_COND, (vx_IrValue) { .type = VX_IR_VAL_BLOCK, .block = var_block(parent, condVar) });

return els;
}
Expand All @@ -77,6 +65,8 @@ static void gen_bin_op(vx_IrBlock *dest, vx_IrOpType optype, vx_IrType *outtype,

static vx_IrBlock * build_test_cmov(void) {
vx_IrBlock *block = vx_IrBlock_init_heap(NULL, 0);
vx_IrBlock_add_in(block, 10, ty_bool);
vx_IrBlock_add_in(block, 11, ty_bool);

{
vx_IrOp *op = vx_IrBlock_add_op_building(block);
Expand All @@ -85,8 +75,8 @@ static vx_IrBlock * build_test_cmov(void) {
vx_IrOp_add_param_s(op, VX_IR_NAME_VALUE, (vx_IrValue) { .type = VX_IR_VAL_IMM_INT, .imm_int = 1 });
}

vx_IrBlock *els = conditional_c_assign_else(0, block, 1);
conditional_c_assign_else(0, els, 2);
vx_IrBlock *els = conditional_c_assign_else(0, block, 2, 10);
conditional_c_assign_else(0, els, 3, 11);

{
vx_IrOp *op = vx_IrBlock_add_op_building(block);
Expand All @@ -96,7 +86,7 @@ static vx_IrBlock * build_test_cmov(void) {
}

vx_IrBlock_add_out(block, 1);
vx_IrBlock_make_root(block, 2);
vx_IrBlock_make_root(block, 12);

return block;
}
Expand Down

0 comments on commit 0d6318b

Please sign in to comment.