From 997c94f7f6e84cd99d940e49cbf54f1165258958 Mon Sep 17 00:00:00 2001 From: Alhad Deshpande Date: Thu, 23 Jun 2022 06:41:36 +0000 Subject: [PATCH 1/4] Avoid transformation from multiplication to left shift in case of 64 bit value --- src/coreclr/pal/src/misc/perfjitdump.cpp | 2 +- src/mono/mono/mini/local-propagation.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreclr/pal/src/misc/perfjitdump.cpp b/src/coreclr/pal/src/misc/perfjitdump.cpp index df7e97af53087e..cc8d46ef1caa49 100644 --- a/src/coreclr/pal/src/misc/perfjitdump.cpp +++ b/src/coreclr/pal/src/misc/perfjitdump.cpp @@ -50,7 +50,7 @@ namespace ELF_MACHINE = EM_LOONGARCH, #elif defined(HOST_S390X) ELF_MACHINE = EM_S390, -#elif defined(HOST_POWERPC) +#elif defined(HOST_POWERPC64) ELF_MACHINE = EM_PPC64, #else #error ELF_MACHINE unsupported for target diff --git a/src/mono/mono/mini/local-propagation.c b/src/mono/mono/mini/local-propagation.c index c640f8d6cd4fef..903565da704235 100644 --- a/src/mono/mono/mini/local-propagation.c +++ b/src/mono/mono/mini/local-propagation.c @@ -350,7 +350,7 @@ mono_strength_reduction_ins (MonoCompile *cfg, MonoInst *ins, const char **spec) ins->opcode = OP_INEG; } else if ((ins->opcode == OP_LMUL_IMM) && (ins->inst_imm == -1)) { ins->opcode = OP_LNEG; - } else if (ins->inst_imm > 0) { + } else if (ins->inst_imm > 0 && ins->inst_imm <= UINT32_MAX) { int power2 = mono_is_power_of_two (GTMREG_TO_UINT32 (ins->inst_imm)); if (power2 >= 0) { ins->opcode = (ins->opcode == OP_MUL_IMM) ? OP_SHL_IMM : ((ins->opcode == OP_LMUL_IMM) ? OP_LSHL_IMM : OP_ISHL_IMM); From a3480241b4d75263593db9c80bf82c4ffed85386 Mon Sep 17 00:00:00 2001 From: Alhad Deshpande Date: Thu, 28 Jul 2022 09:26:15 +0000 Subject: [PATCH 2/4] Fixed System.Collections.Concurrent.Tests timeout issue --- src/mono/mono/mini/cpu-ppc.mdesc | 2 +- src/mono/mono/mini/cpu-ppc64.mdesc | 2 +- src/mono/mono/mini/mini-ppc.c | 19 +++++++++++++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/mono/mono/mini/cpu-ppc.mdesc b/src/mono/mono/mini/cpu-ppc.mdesc index 23b4a64d2309c9..eaa3bb22c861d5 100644 --- a/src/mono/mono/mini/cpu-ppc.mdesc +++ b/src/mono/mono/mini/cpu-ppc.mdesc @@ -348,4 +348,4 @@ atomic_cas_i4: src1:b src2:i src3:i dest:i len:38 liverange_start: len:0 liverange_end: len:0 -gc_safe_point: len:0 +gc_safe_point: clob:c src1:i len:40 diff --git a/src/mono/mono/mini/cpu-ppc64.mdesc b/src/mono/mono/mini/cpu-ppc64.mdesc index f59e1ee1b85193..3106cba91a7cd8 100644 --- a/src/mono/mono/mini/cpu-ppc64.mdesc +++ b/src/mono/mono/mini/cpu-ppc64.mdesc @@ -417,4 +417,4 @@ atomic_cas_i8: src1:b src2:i src3:i dest:i len:38 liverange_start: len:0 liverange_end: len:0 -gc_safe_point: len:0 +gc_safe_point: clob:c src1:i len:40 diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c index b88fe674984295..c1e9c0ecb84022 100644 --- a/src/mono/mono/mini/mini-ppc.c +++ b/src/mono/mono/mini/mini-ppc.c @@ -4574,9 +4574,24 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) MONO_VARINFO (cfg, ins->inst_c0)->live_range_end = code - cfg->native_code; break; } - case OP_GC_SAFE_POINT: + case OP_GC_SAFE_POINT: { + guint8 *br; + ppc_ldr (code, ppc_r0, 0, ins->sreg1); + ppc_cmpi (code, 0, 0, ppc_r0, 0); + br = code; + ppc_bc (code, PPC_BR_TRUE, PPC_BR_EQ, 0); + mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_JIT_ICALL_ID, + GUINT_TO_POINTER (MONO_JIT_ICALL_mono_threads_state_poll)); + if ((FORCE_INDIR_CALL || cfg->method->dynamic) && !cfg->compile_aot) { + ppc_load_func (code, PPC_CALL_REG, 0); + ppc_mtlr (code, PPC_CALL_REG); + ppc_blrl (code); + } else { + ppc_bl (code, 0); + } + ppc_patch (br, code); break; - + } default: g_warning ("unknown opcode %s in %s()\n", mono_inst_name (ins->opcode), __FUNCTION__); g_assert_not_reached (); From ae1bdde102020f471703bb2ca3dc802e870c837d Mon Sep 17 00:00:00 2001 From: Alhad Deshpande Date: Wed, 17 Aug 2022 07:00:17 +0000 Subject: [PATCH 3/4] [ppc64le] Fixed test case failures --- src/mono/mono/mini/cpu-ppc64.mdesc | 20 +++++++------- src/mono/mono/mini/mini-ppc.c | 42 +++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/mono/mono/mini/cpu-ppc64.mdesc b/src/mono/mono/mini/cpu-ppc64.mdesc index d2437a34fda45e..77d99656d72151 100644 --- a/src/mono/mono/mini/cpu-ppc64.mdesc +++ b/src/mono/mono/mini/cpu-ppc64.mdesc @@ -45,18 +45,18 @@ # # See the code in mini-x86.c for more details on how the specifiers are used. # -tailcall: len:124 clob:c +tailcall: len:152 clob:c tailcall_parameter: len:0 # PowerPC outputs a nice fixed size memcpy loop for larger stack_usage, so 0. memory_barrier: len:4 nop: len:4 relaxed_nop: len:4 -break: len:40 +break: len:44 seq_point: len:48 il_seq_point: len:0 -call: dest:a clob:c len:36 +call: dest:a clob:c len:40 br: len:4 -throw: src1:i len:40 -rethrow: src1:i len:40 +throw: src1:i len:44 +rethrow: src1:i len:44 ckfinite: dest:f src1:f ppc_check_finite: src1:i len:16 add_ovf_carry: dest:i src1:i src2:i len:16 @@ -77,16 +77,16 @@ fcompare: src1:f src2:f len:12 arglist: src1:i len:12 setlret: src1:i src2:i len:12 check_this: src1:b len:4 -voidcall: len:36 clob:c +voidcall: len:40 clob:c voidcall_reg: src1:i len:16 clob:c voidcall_membase: src1:b len:16 clob:c -fcall: dest:g len:36 clob:c +fcall: dest:g len:40 clob:c fcall_reg: dest:g src1:i len:16 clob:c fcall_membase: dest:g src1:b len:16 clob:c -lcall: dest:a len:36 clob:c +lcall: dest:a len:40 clob:c lcall_reg: dest:a src1:i len:16 clob:c lcall_membase: dest:a src1:b len:16 clob:c -vcall: len:16 clob:c +vcall: len:20 clob:c vcall_reg: src1:i len:16 clob:c vcall_membase: src1:b len:12 clob:c call_reg: dest:a src1:i len:16 clob:c @@ -404,7 +404,7 @@ int_max_un: dest:i src1:i src2:i len:8 clob:1 #long_conv_to_ovf_i4_2: dest:i src1:i src2:i len:30 -vcall2: len:36 clob:c +vcall2: len:40 clob:c vcall2_reg: src1:i len:16 clob:c vcall2_membase: src1:b len:16 clob:c diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c index 93abd63562ff53..6e0d83b0c05700 100644 --- a/src/mono/mono/mini/mini-ppc.c +++ b/src/mono/mono/mini/mini-ppc.c @@ -5142,8 +5142,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) int soffset = 0; int cur_reg; int size = 0; - g_assert (ppc_is_imm16 (inst->inst_offset)); - g_assert (ppc_is_imm16 (inst->inst_offset + ainfo->vtregs * sizeof (target_mgreg_t))); + g_assert (ppc_is_imm32 (inst->inst_offset)); + g_assert (ppc_is_imm32 (inst->inst_offset + ainfo->vtregs * sizeof (target_mgreg_t))); /* FIXME: what if there is no class? */ if (sig->pinvoke && !sig->marshalling_disabled && mono_class_from_mono_type_internal (inst->inst_vtype)) size = mono_class_native_size (mono_class_from_mono_type_internal (inst->inst_vtype), NULL); @@ -5171,21 +5171,39 @@ mono_arch_emit_prolog (MonoCompile *cfg) (sizeof (target_mgreg_t) - ainfo->bytes) * 8); ppc_stptr (code, ppc_r0, doffset, inst->inst_basereg); #else - if (mono_class_native_size (inst->klass, NULL) == 1) { - ppc_stb (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); - } else if (mono_class_native_size (inst->klass, NULL) == 2) { - ppc_sth (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); - } else if (mono_class_native_size (inst->klass, NULL) == 4) { // WDS -- maybe <=4? - ppc_stw (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); - } else { - ppc_stptr (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); // WDS -- Better way? + if (ppc_is_imm16 (inst->inst_offset)) { + if (mono_class_native_size (inst->klass, NULL) == 1) { + ppc_stb (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); + } else if (mono_class_native_size (inst->klass, NULL) == 2) { + ppc_sth (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); + } else if (mono_class_native_size (inst->klass, NULL) == 4) { // WDS -- maybe <=4? + ppc_stw (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); + } else { + ppc_stptr (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); // WDS -- Better way? + } + } + else if (ppc_is_imm32 (inst->inst_offset)) { + ppc_addis (code, ainfo->reg + cur_reg, inst->inst_basereg, ppc_ha(doffset)); + ppc_stptr (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); + } + else { + g_assert_not_reached(); } #endif } else #endif { - ppc_stptr (code, ainfo->reg + cur_reg, doffset, - inst->inst_basereg); + if (ppc_is_imm16 (inst->inst_offset)) { + ppc_stptr (code, ainfo->reg + cur_reg, doffset, + inst->inst_basereg); + } + else if (ppc_is_imm32 (inst->inst_offset)) { + ppc_addis (code, ainfo->reg + cur_reg, inst->inst_basereg, ppc_ha(doffset)); + ppc_stptr (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); + } + else { + g_assert_not_reached(); + } } } soffset += sizeof (target_mgreg_t); From 46c5a681058dd9b7fea0c9c919137a8b3533ccf7 Mon Sep 17 00:00:00 2001 From: Alhad Deshpande Date: Wed, 17 Aug 2022 13:07:05 +0000 Subject: [PATCH 4/4] [ppc64le] Incorporated code review comments --- src/mono/mono/mini/mini-ppc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c index 6e0d83b0c05700..cf8f045f992371 100644 --- a/src/mono/mono/mini/mini-ppc.c +++ b/src/mono/mono/mini/mini-ppc.c @@ -5183,8 +5183,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) } } else if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ainfo->reg + cur_reg, inst->inst_basereg, ppc_ha(doffset)); - ppc_stptr (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(doffset)); + ppc_stptr (code, ainfo->reg + cur_reg, doffset, ppc_r12); } else { g_assert_not_reached(); @@ -5198,8 +5198,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) inst->inst_basereg); } else if (ppc_is_imm32 (inst->inst_offset)) { - ppc_addis (code, ainfo->reg + cur_reg, inst->inst_basereg, ppc_ha(doffset)); - ppc_stptr (code, ainfo->reg + cur_reg, doffset, inst->inst_basereg); + ppc_addis (code, ppc_r12, inst->inst_basereg, ppc_ha(doffset)); + ppc_stptr (code, ainfo->reg + cur_reg, doffset, ppc_r12); } else { g_assert_not_reached();