From de3fa74e12eb7b39d6c8217e96166dc16e8e51e8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Thu, 22 Jun 2017 17:32:10 +0200 Subject: [PATCH] [mini] Use an atomic add for the code coverage counter when possible. --- mono/mini/method-to-ir.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index c802e82394c..a32facdf78d 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -7701,18 +7701,25 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b if ((cfg->method == method) && cfg->coverage_info) { guint32 cil_offset = ip - header->code; + gpointer counter = &cfg->coverage_info->data [cil_offset].count; cfg->coverage_info->data [cil_offset].cil_code = ip; - /* TODO: Use an increment here */ -#if defined(TARGET_X86) - MONO_INST_NEW (cfg, ins, OP_STORE_MEM_IMM); - ins->inst_p0 = &(cfg->coverage_info->data [cil_offset].count); - ins->inst_imm = 1; - MONO_ADD_INS (cfg->cbb, ins); -#else - EMIT_NEW_PCONST (cfg, ins, &(cfg->coverage_info->data [cil_offset].count)); - MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, ins->dreg, 0, 1); -#endif + if (mono_arch_opcode_supported (OP_ATOMIC_ADD_I4)) { + MonoInst *one_ins, *load_ins; + + EMIT_NEW_PCONST (cfg, load_ins, counter); + EMIT_NEW_ICONST (cfg, one_ins, 1); + MONO_INST_NEW (cfg, ins, OP_ATOMIC_ADD_I4); + ins->dreg = mono_alloc_ireg (cfg); + ins->inst_basereg = load_ins->dreg; + ins->inst_offset = 0; + ins->sreg2 = one_ins->dreg; + ins->type = STACK_I4; + MONO_ADD_INS (cfg->cbb, ins); + } else { + EMIT_NEW_PCONST (cfg, ins, counter); + MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, ins->dreg, 0, 1); + } } if (cfg->verbose_level > 3) -- 2.25.1