diff options
| author | gingerBill <bill@gingerbill.org> | 2019-02-06 13:33:31 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2019-02-06 13:33:31 +0000 |
| commit | a194aa5a9e0f7197854ad648c555d14fb325bc9b (patch) | |
| tree | a474d34af34c69b1dca883bc1efafd4d15d3fa1d /src/ir.cpp | |
| parent | fa5d00521b90583939282f5668b88f77f49d157f (diff) | |
Minimize mem.zero use
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 76 |
1 files changed, 40 insertions, 36 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 16f202c6a..79c07a91b 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -1583,7 +1583,7 @@ irValue *ir_add_local_for_identifier(irProcedure *proc, Ast *ident, bool zero_in return nullptr; } -irValue *ir_add_local_generated(irProcedure *proc, Type *type, bool zero_initialized = true) { +irValue *ir_add_local_generated(irProcedure *proc, Type *type, bool zero_initialized) { GB_ASSERT(type != nullptr); type = default_type(type); @@ -2809,7 +2809,7 @@ irValue *ir_find_or_generate_context_ptr(irProcedure *proc) { defer (proc->curr_block = tmp_block); - irValue *c = ir_add_local_generated(proc, t_context); + irValue *c = ir_add_local_generated(proc, t_context, true); ir_push_context_onto_stack(proc, c); ir_emit_store(proc, c, ir_emit_load(proc, proc->module->global_default_context)); ir_emit_init_context(proc, c); @@ -2890,7 +2890,7 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array<irValue *> args, Pro Type *abi_rt = pt->Proc.abi_compat_result_type; Type *rt = reduce_tuple_to_single_type(results); if (pt->Proc.return_by_pointer) { - irValue *return_ptr = ir_add_local_generated(p, rt); + irValue *return_ptr = ir_add_local_generated(p, rt, true); GB_ASSERT(is_type_pointer(ir_type(return_ptr))); ir_emit(p, ir_instr_call(p, value, return_ptr, args, nullptr, context_ptr, inlining)); result = ir_emit_load(p, return_ptr); @@ -3061,7 +3061,7 @@ irValue *ir_emit_comp(irProcedure *proc, TokenKind op_kind, irValue *left, irVal irValue *ir_gen_map_header(irProcedure *proc, irValue *map_val_ptr, Type *map_type) { GB_ASSERT_MSG(is_type_pointer(ir_type(map_val_ptr)), "%s", type_to_string(ir_type(map_val_ptr))); gbAllocator a = ir_allocator(); - irValue *h = ir_add_local_generated(proc, t_map_header); + irValue *h = ir_add_local_generated(proc, t_map_header, false); // all the values will be initialzed later map_type = base_type(map_type); Type *key_type = map_type->Map.key; @@ -3072,9 +3072,7 @@ irValue *ir_gen_map_header(irProcedure *proc, irValue *map_val_ptr, Type *map_ty irValue *m = ir_emit_conv(proc, map_val_ptr, type_deref(ir_type(gep0))); ir_emit_store(proc, gep0, m); - if (is_type_string(key_type)) { - ir_emit_store(proc, ir_emit_struct_ep(proc, h, 1), v_true); - } + ir_emit_store(proc, ir_emit_struct_ep(proc, h, 1), ir_const_bool(is_type_string(key_type))); i64 entry_size = type_size_of (map_type->Map.entry_type); i64 entry_align = type_align_of (map_type->Map.entry_type); @@ -3092,7 +3090,7 @@ irValue *ir_gen_map_header(irProcedure *proc, irValue *map_val_ptr, Type *map_ty irValue *ir_gen_map_key(irProcedure *proc, irValue *key, Type *key_type) { Type *hash_type = t_u64; - irValue *v = ir_add_local_generated(proc, t_map_key); + irValue *v = ir_add_local_generated(proc, t_map_key, true); Type *t = base_type(ir_type(key)); key = ir_emit_conv(proc, key, key_type); if (is_type_integer(t)) { @@ -3300,7 +3298,7 @@ irValue *ir_addr_load(irProcedure *proc, irAddr const &addr) { if (addr.kind == irAddr_Map) { // TODO(bill): map lookup Type *map_type = base_type(addr.map_type); - irValue *v = ir_add_local_generated(proc, map_type->Map.lookup_result_type); + irValue *v = ir_add_local_generated(proc, map_type->Map.lookup_result_type, true); irValue *h = ir_gen_map_header(proc, addr.addr, map_type); irValue *key = ir_gen_map_key(proc, addr.map_key, map_type->Map.key); @@ -3481,7 +3479,7 @@ irLoopData ir_loop_start(irProcedure *proc, isize count) { irValue *max = ir_const_int(count); - data.idx_addr = ir_add_local_generated(proc, t_int); + data.idx_addr = ir_add_local_generated(proc, t_int, true); data.body = ir_new_block(proc, nullptr, "loop.body"); data.done = ir_new_block(proc, nullptr, "loop.done"); @@ -3536,7 +3534,8 @@ irValue *ir_emit_unary_arith(irProcedure *proc, TokenKind op, irValue *x, Type * GB_ASSERT(is_type_array(type)); Type *elem_type = base_array_type(type); - irValue *res = ir_add_local_generated(proc, type); + // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops + irValue *res = ir_add_local_generated(proc, type, false); bool inline_array_arith = type_size_of(type) <= build_context.max_align; @@ -3594,8 +3593,8 @@ irValue *ir_emit_arith(irProcedure *proc, TokenKind op, irValue *left, irValue * GB_ASSERT(is_type_array(type)); Type *elem_type = base_array_type(type); - // TODO(bill): Should this be zero initialized? - irValue *res = ir_add_local_generated(proc, type); + // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops + irValue *res = ir_add_local_generated(proc, type, false); i64 count = base_type(type)->Array.count; bool inline_array_arith = type_size_of(type) <= build_context.max_align; @@ -4754,7 +4753,8 @@ irValue *ir_emit_conv(irProcedure *proc, irValue *value, Type *t) { if (is_type_array(dst)) { Type *elem = dst->Array.elem; irValue *e = ir_emit_conv(proc, value, elem); - irValue *v = ir_add_local_generated(proc, t); + // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops + irValue *v = ir_add_local_generated(proc, t, false); isize index_count = cast(isize)dst->Array.count; for (i32 i = 0; i < index_count; i++) { @@ -4765,7 +4765,7 @@ irValue *ir_emit_conv(irProcedure *proc, irValue *value, Type *t) { } if (is_type_any(dst)) { - irValue *result = ir_add_local_generated(proc, t_any); + irValue *result = ir_add_local_generated(proc, t_any, true); if (is_type_untyped_nil(src)) { return ir_emit_load(proc, result); @@ -4894,7 +4894,7 @@ irValue *ir_emit_union_cast(irProcedure *proc, irValue *value, Type *type, Token tuple = make_optional_ok_type(type); } - irValue *v = ir_add_local_generated(proc, tuple); + irValue *v = ir_add_local_generated(proc, tuple, true); if (is_ptr) { value = ir_emit_load(proc, value); @@ -4964,7 +4964,7 @@ irAddr ir_emit_any_cast_addr(irProcedure *proc, irValue *value, Type *type, Toke } Type *dst_type = tuple->Tuple.variables[0]->type; - irValue *v = ir_add_local_generated(proc, tuple); + irValue *v = ir_add_local_generated(proc, tuple, true); irValue *dst_typeid = ir_typeid(proc->module, dst_type); irValue *any_typeid = ir_emit_struct_ev(proc, value, 1); @@ -5615,7 +5615,7 @@ void ir_init_data_with_defaults(irProcedure *proc, irValue *ptr, irValue *count, Type *elem_type = type_deref(ir_type(ptr)); GB_ASSERT(is_type_struct(elem_type) || is_type_array(elem_type)); - irValue *index = ir_add_local_generated(proc, t_int); + irValue *index = ir_add_local_generated(proc, t_int, false); ir_emit_store(proc, index, ir_const_int(0)); irBlock *loop = nullptr; @@ -5634,7 +5634,8 @@ void ir_init_data_with_defaults(irProcedure *proc, irValue *ptr, irValue *count, ir_start_block(proc, body); irValue *offset_ptr = ir_emit_ptr_offset(proc, ptr, ir_emit_load(proc, index)); - ir_emit_zero_init(proc, offset_ptr, expr); + ir_emit(proc, ir_instr_zero_init(proc, offset_ptr)); // Use simple zero for this + // ir_emit_zero_init(proc, offset_ptr, expr); ir_emit_increment(proc, index); @@ -5758,7 +5759,8 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu return ir_addr_load(proc, addr); } irValue *src = ir_addr_get_ptr(proc, addr); - irValue *dst = ir_add_local_generated(proc, tv.type); + // TODO(bill): Should this be zeroed or not? + irValue *dst = ir_add_local_generated(proc, tv.type, true); for (i32 i = 1; i < ce->args.count; i++) { TypeAndValue tv = type_and_value_of_expr(ce->args[i]); @@ -5781,7 +5783,7 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu ir_emit_comment(proc, str_lit("complex")); irValue *real = ir_build_expr(proc, ce->args[0]); irValue *imag = ir_build_expr(proc, ce->args[1]); - irValue *dst = ir_add_local_generated(proc, tv.type); + irValue *dst = ir_add_local_generated(proc, tv.type, false); Type *ft = base_complex_elem_type(tv.type); real = ir_emit_conv(proc, real, ft); @@ -5811,7 +5813,7 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu irValue *res = nullptr; Type *t = ir_type(val); if (is_type_complex(t)) { - res = ir_add_local_generated(proc, tv.type); + res = ir_add_local_generated(proc, tv.type, false); irValue *real = ir_emit_struct_ev(proc, val, 0); irValue *imag = ir_emit_struct_ev(proc, val, 1); imag = ir_emit_unary_arith(proc, Token_Sub, imag, ir_type(imag)); @@ -5827,7 +5829,8 @@ irValue *ir_build_builtin_proc(irProcedure *proc, Ast *expr, TypeAndValue tv, Bu Type *t = base_type(ir_type(val)); GB_ASSERT(is_type_tuple(tv.type)); - irValue *tuple = ir_add_local_generated(proc, tv.type); + // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops + irValue *tuple = ir_add_local_generated(proc, tv.type, false); if (t->kind == Type_Struct) { for_array(src_index, t->Struct.fields) { Entity *field = t->Struct.fields[src_index]; @@ -6632,11 +6635,11 @@ irValue *ir_build_expr_internal(irProcedure *proc, Ast *expr) { gbAllocator allocator = ir_allocator(); Type *slice_type = param_tuple->variables[variadic_index]->type; Type *elem_type = base_type(slice_type)->Slice.elem; - irValue *slice = ir_add_local_generated(proc, slice_type); + irValue *slice = ir_add_local_generated(proc, slice_type, true); isize slice_len = arg_count+1 - (variadic_index+1); if (slice_len > 0) { - irValue *base_array = ir_add_local_generated(proc, alloc_type_array(elem_type, slice_len)); + irValue *base_array = ir_add_local_generated(proc, alloc_type_array(elem_type, slice_len), true); for (isize i = variadic_index, j = 0; i < arg_count; i++, j++) { irValue *addr = ir_emit_array_epi(proc, base_array, cast(i32)j); @@ -6868,7 +6871,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { Type *t = type_deref(ir_type(e)); if (is_type_union(t)) { Type *type = type_of_expr(expr); - irValue *v = ir_add_local_generated(proc, type); + irValue *v = ir_add_local_generated(proc, type, false); ir_emit_comment(proc, str_lit("cast - union_cast")); ir_emit_store(proc, v, ir_emit_union_cast(proc, ir_build_expr(proc, ta->expr), type, pos)); return ir_addr(v); @@ -7039,7 +7042,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { irValue *elem = ir_emit_ptr_offset(proc, ir_slice_elem(proc, base), low); irValue *new_len = ir_emit_arith(proc, Token_Sub, high, low, t_int); - irValue *slice = ir_add_local_generated(proc, slice_type); + irValue *slice = ir_add_local_generated(proc, slice_type, false); ir_fill_slice(proc, slice, elem, new_len); return ir_addr(slice); } @@ -7056,7 +7059,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { irValue *elem = ir_emit_ptr_offset(proc, ir_dynamic_array_elem(proc, base), low); irValue *new_len = ir_emit_arith(proc, Token_Sub, high, low, t_int); - irValue *slice = ir_add_local_generated(proc, slice_type); + irValue *slice = ir_add_local_generated(proc, slice_type, false); ir_fill_slice(proc, slice, elem, new_len); return ir_addr(slice); } @@ -7077,7 +7080,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { irValue *elem = ir_emit_ptr_offset(proc, ir_array_elem(proc, addr), low); irValue *new_len = ir_emit_arith(proc, Token_Sub, high, low, t_int); - irValue *slice = ir_add_local_generated(proc, slice_type); + irValue *slice = ir_add_local_generated(proc, slice_type, false); ir_fill_slice(proc, slice, elem, new_len); return ir_addr(slice); } @@ -7093,7 +7096,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { irValue *elem = ir_emit_ptr_offset(proc, ir_string_elem(proc, base), low); irValue *new_len = ir_emit_arith(proc, Token_Sub, high, low, t_int); - irValue *str = ir_add_local_generated(proc, t_string); + irValue *str = ir_add_local_generated(proc, t_string, false); ir_fill_string(proc, str, elem, new_len); return ir_addr(str); } @@ -7112,7 +7115,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { case_ast_node(ce, CallExpr, expr); // NOTE(bill): This is make sure you never need to have an 'array_ev' irValue *e = ir_build_expr(proc, expr); - irValue *v = ir_add_local_generated(proc, ir_type(e)); + irValue *v = ir_add_local_generated(proc, ir_type(e), false); ir_emit_store(proc, v, e); return ir_addr(v); case_end; @@ -7401,7 +7404,7 @@ irAddr ir_build_addr(irProcedure *proc, Ast *expr) { default: GB_PANIC("Invalid AST TypeCast"); } - irValue *v = ir_add_local_generated(proc, type); + irValue *v = ir_add_local_generated(proc, type, false); ir_emit_store(proc, v, e); return ir_addr(v); case_end; @@ -7694,7 +7697,7 @@ void ir_build_range_indexed(irProcedure *proc, irValue *expr, Type *val_type, ir irBlock *body = nullptr; - irValue *index = ir_add_local_generated(proc, t_int); + irValue *index = ir_add_local_generated(proc, t_int, false); ir_emit_store(proc, index, ir_const_int(-1)); loop = ir_new_block(proc, nullptr, "for.index.loop"); @@ -7738,7 +7741,7 @@ void ir_build_range_indexed(irProcedure *proc, irValue *expr, Type *val_type, ir break; } case Type_Map: { - irValue *key = ir_add_local_generated(proc, expr_type->Map.key); + irValue *key = ir_add_local_generated(proc, expr_type->Map.key, true); irValue *entries = ir_map_entries_ptr(proc, expr); irValue *elem = ir_emit_struct_ep(proc, entries, 0); @@ -7793,7 +7796,7 @@ void ir_build_range_string(irProcedure *proc, irValue *expr, Type *val_type, irBlock *body = nullptr; - irValue *offset_ = ir_add_local_generated(proc, t_int); + irValue *offset_ = ir_add_local_generated(proc, t_int, false); ir_emit_store(proc, offset_, v_zero); loop = ir_new_block(proc, nullptr, "for.string.loop"); @@ -8224,7 +8227,8 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) { GB_ASSERT(results.count == return_count); Type *ret_type = proc->type->Proc.results; - v = ir_add_local_generated(proc, ret_type); + // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops + v = ir_add_local_generated(proc, ret_type, false); for_array(i, results) { Entity *e = tuple->variables[i]; irValue *res = ir_emit_conv(proc, results[i], e->type); |