Browse Source

Extra checks to reduce mem.zero calls

gingerBill 6 years ago
parent
commit
bc5c37ebb1
2 changed files with 11 additions and 7 deletions
  1. 10 6
      src/ir.cpp
  2. 1 1
      src/ir_print.cpp

+ 10 - 6
src/ir.cpp

@@ -2740,12 +2740,16 @@ void ir_value_set_debug_location(irProcedure *proc, irValue *v) {
 void ir_emit_zero_init(irProcedure *p, irValue *address, Ast *expr) {
 	gbAllocator a = ir_allocator();
 	Type *t = type_deref(ir_type(address));
-	auto args = array_make<irValue *>(a, 2);
-	args[0] = ir_emit_conv(p, address, t_rawptr);
-	args[1] = ir_const_int(type_size_of(t));
-	AstPackage *pkg = get_core_package(p->module->info, str_lit("mem"));
-	if (p->entity != nullptr && p->entity->token.string != "zero" && p->entity->pkg != pkg) {
-		irValue *v = ir_emit_package_call(p, "mem", "zero", args, expr, ProcInlining_no_inline);
+	isize sz = type_size_of(t);
+	if (!(gb_is_power_of_two(sz) && sz <= build_context.max_align)) {
+		// TODO(bill): Is this a good idea?
+		auto args = array_make<irValue *>(a, 2);
+		args[0] = ir_emit_conv(p, address, t_rawptr);
+		args[1] = ir_const_int(type_size_of(t));
+		AstPackage *pkg = get_core_package(p->module->info, str_lit("mem"));
+		if (p->entity != nullptr && p->entity->token.string != "zero" && p->entity->pkg != pkg) {
+			irValue *v = ir_emit_package_call(p, "mem", "zero", args, expr, ProcInlining_no_inline);
+		}
 	}
 	ir_emit(p, ir_instr_zero_init(p, address));
 }

+ 1 - 1
src/ir_print.cpp

@@ -1109,7 +1109,7 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) {
 		ir_print_exact_value(f, m, empty_exact_value, type);
 		ir_write_str_lit(f, ", ");
 		ir_print_type(f, m, type);
-		ir_fprintf(f, "* %%%d", instr->ZeroInit.address->index);
+		ir_fprintf(f, "* %%%d, align 1", instr->ZeroInit.address->index);
 		break;
 	}