From 502cfb3b2b287c684b7644a1d82a5e684e695163 Mon Sep 17 00:00:00 2001 From: Zoltan Varga Date: Sat, 9 Mar 2024 11:24:44 -0500 Subject: [PATCH] [mono][jit] Optimize JIT time on platforms without SIMD support. * Move the if (cfg->opt & MONO_OPT_SIMD) checks into simd-intrinsics.c so the IsSupported checks can be intrinsified even if SIMD is disabled. * Implement mono_simd_unsupported_aggressive_inline_intrinsic_type () in the non-simd cases as well, add more types. Re: https://github.com/dotnet/runtime/issues/97295. --- src/mono/mono/mini/intrinsics.c | 16 ++--- src/mono/mono/mini/method-to-ir.c | 6 +- src/mono/mono/mini/mini-ops.h | 4 -- src/mono/mono/mini/mini.c | 3 + src/mono/mono/mini/mini.h | 2 +- src/mono/mono/mini/simd-intrinsics.c | 88 +++++++++------------------- 6 files changed, 40 insertions(+), 79 deletions(-) diff --git a/src/mono/mono/mini/intrinsics.c b/src/mono/mono/mini/intrinsics.c index 178da508ce2e0..4835a84e2c911 100644 --- a/src/mono/mono/mini/intrinsics.c +++ b/src/mono/mono/mini/intrinsics.c @@ -82,11 +82,9 @@ mini_emit_inst_for_ctor (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignat if (!(cfg->opt & MONO_OPT_INTRINS)) return ins; - if (cfg->opt & MONO_OPT_SIMD) { - ins = mono_emit_simd_intrinsics (cfg, cmethod, fsig, args); - if (ins) - return ins; - } + ins = mono_emit_simd_intrinsics (cfg, cmethod, fsig, args); + if (ins) + return ins; ins = mono_emit_common_intrinsics (cfg, cmethod, fsig, args); if (ins) @@ -2093,11 +2091,9 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign } } - if (cfg->opt & MONO_OPT_SIMD) { - ins = mono_emit_simd_intrinsics (cfg, cmethod, fsig, args); - if (ins) - return ins; - } + ins = mono_emit_simd_intrinsics (cfg, cmethod, fsig, args); + if (ins) + return ins; ins = mono_emit_common_intrinsics (cfg, cmethod, fsig, args); if (ins) diff --git a/src/mono/mono/mini/method-to-ir.c b/src/mono/mono/mini/method-to-ir.c index 324b4ba778c02..18c4167762ca6 100644 --- a/src/mono/mono/mini/method-to-ir.c +++ b/src/mono/mono/mini/method-to-ir.c @@ -4735,11 +4735,11 @@ mini_inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature * } static gboolean -aggressive_inline_method (MonoMethod *cmethod) +aggressive_inline_method (MonoCompile *cfg, MonoMethod *cmethod) { gboolean aggressive_inline = m_method_is_aggressive_inlining (cmethod); if (aggressive_inline) - aggressive_inline = !mono_simd_unsupported_aggressive_inline_intrinsic_type (cmethod); + aggressive_inline = !mono_simd_unsupported_aggressive_inline_intrinsic_type (cfg, cmethod); return aggressive_inline; } @@ -4868,7 +4868,7 @@ inline_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, cfg->disable_inline = prev_disable_inline; cfg->inline_depth --; - if ((costs >= 0 && costs < 60) || inline_always || (costs >= 0 && aggressive_inline_method (cmethod))) { + if ((costs >= 0 && costs < 60) || inline_always || (costs >= 0 && aggressive_inline_method (cfg, cmethod))) { if (cfg->verbose_level > 2) printf ("INLINE END %s -> %s\n", mono_method_full_name (cfg->method, TRUE), mono_method_full_name (cmethod, TRUE)); diff --git a/src/mono/mono/mini/mini-ops.h b/src/mono/mono/mini/mini-ops.h index 3221458d2ae55..ec82dd5de8a8c 100644 --- a/src/mono/mono/mini/mini-ops.h +++ b/src/mono/mono/mini/mini-ops.h @@ -804,8 +804,6 @@ MINI_OP(OP_LDTOKEN_FIELD, "ldtoken_field", VREG, VREG, NONE) /* SIMD opcodes. */ -#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_WASM) || defined(TARGET_ARM64) - MINI_OP(OP_ICONV_TO_R4_RAW, "iconv_to_r4_raw", FREG, IREG, NONE) /* Extract an element from a vector with a constant lane index. @@ -853,8 +851,6 @@ MINI_OP(OP_EXPAND_R4, "expand_r4", XREG, FREG, NONE) MINI_OP(OP_EXPAND_I8, "expand_i8", XREG, IREG, NONE) MINI_OP(OP_EXPAND_R8, "expand_r8", XREG, FREG, NONE) -#endif - // wasm specific SIMD v128 #if defined(TARGET_WASM) diff --git a/src/mono/mono/mini/mini.c b/src/mono/mono/mini/mini.c index eb174000eabe7..4463f38bcaa0f 100644 --- a/src/mono/mono/mini/mini.c +++ b/src/mono/mono/mini/mini.c @@ -3037,6 +3037,9 @@ is_simd_supported (MonoCompile *cfg) { #ifdef DISABLE_SIMD return FALSE; +#endif +#ifndef MONO_ARCH_SIMD_INTRINSICS + return FALSE; #endif // FIXME: Clean this up #ifdef TARGET_WASM diff --git a/src/mono/mono/mini/mini.h b/src/mono/mono/mini/mini.h index 9982afc22e3f2..70aab00b740f2 100644 --- a/src/mono/mono/mini/mini.h +++ b/src/mono/mono/mini/mini.h @@ -2962,7 +2962,7 @@ MonoInst* mono_emit_common_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoInst* mono_emit_simd_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args); MonoInst* mono_emit_simd_field_load (MonoCompile *cfg, MonoClassField *field, MonoInst *addr); void mono_simd_intrinsics_init (void); -gboolean mono_simd_unsupported_aggressive_inline_intrinsic_type (MonoMethod *cmethod); +gboolean mono_simd_unsupported_aggressive_inline_intrinsic_type (MonoCompile *cfg, MonoMethod *cmethod); MonoMethod* mini_method_to_shared (MonoMethod *method); // null if not shared diff --git a/src/mono/mono/mini/simd-intrinsics.c b/src/mono/mono/mini/simd-intrinsics.c index 8f025fb064998..eef07e49ca199 100644 --- a/src/mono/mono/mini/simd-intrinsics.c +++ b/src/mono/mono/mini/simd-intrinsics.c @@ -19,8 +19,6 @@ #include #include -#if defined (MONO_ARCH_SIMD_INTRINSICS) - #if defined(DISABLE_JIT) void @@ -1100,8 +1098,6 @@ emit_vector_create_elementwise ( return ins; } -#if defined(TARGET_AMD64) || defined(TARGET_ARM64) || defined(TARGET_WASM) - static int type_to_xinsert_op (MonoTypeEnum type) { @@ -1425,6 +1421,9 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi if (vector_size == 256 || vector_size == 512) return NULL; + if (!(cfg->opt & MONO_OPT_SIMD)) + return NULL; + // FIXME: This limitation could be removed once everything here are supported by mini JIT on arm64 #ifdef TARGET_ARM64 if (!COMPILE_LLVM (cfg)) { @@ -2520,6 +2519,9 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f return ins; } + if (!(cfg->opt & MONO_OPT_SIMD)) + return NULL; + /* Vector256/Vector512 */ if (size == 32 || size == 64) return NULL; @@ -2744,6 +2746,9 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f return NULL; #endif + if (!(cfg->opt & MONO_OPT_SIMD)) + return NULL; + if (cfg->verbose_level > 1) { char *name = mono_method_full_name (cmethod, TRUE); printf (" SIMD intrinsic %s\n", name); @@ -3089,8 +3094,6 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f return NULL; } -#endif // defined(TARGET_AMD64) || defined(TARGET_ARM64) || defined(TARGET_WASM) - #ifdef TARGET_ARM64 static SimdIntrinsic armbase_methods [] = { @@ -5608,9 +5611,11 @@ emit_simd_intrinsics (const char *class_ns, const char *class_name, MonoCompile { MonoInst *ins; - ins = arch_emit_simd_intrinsics (class_ns, class_name, cfg, cmethod, fsig, args); - if (ins) - return ins; + if (cfg->opt & MONO_OPT_SIMD) { + ins = arch_emit_simd_intrinsics (class_ns, class_name, cfg, cmethod, fsig, args); + if (ins) + return ins; + } if (!strcmp (class_ns, "System.Runtime.Intrinsics")) { if (!strcmp (class_name, "Vector64") || !strcmp (class_name, "Vector128") || !strcmp (class_name, "Vector256") || !strcmp (class_name, "Vector512")) @@ -5749,8 +5754,17 @@ mono_simd_decompose_intrinsic (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *i } } +#else + +void +mono_simd_decompose_intrinsic (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *ins) +{ +} + +#endif /*defined(TARGET_WIN32) && defined(TARGET_AMD64)*/ + gboolean -mono_simd_unsupported_aggressive_inline_intrinsic_type (MonoMethod *cmethod) +mono_simd_unsupported_aggressive_inline_intrinsic_type (MonoCompile *cfg, MonoMethod *cmethod) { /* * If a method has been marked with aggressive inlining, check if we support @@ -5761,66 +5775,18 @@ mono_simd_unsupported_aggressive_inline_intrinsic_type (MonoMethod *cmethod) if (!strcmp (m_class_get_name_space (cmethod->klass), "System.Runtime.Intrinsics")) { if (!strncmp(m_class_get_name (cmethod->klass), "Vector", 6)) { const char *vector_type = m_class_get_name (cmethod->klass) + 6; - if (!strcmp(vector_type, "256`1") || !strcmp(vector_type, "512`1")) + if (!strcmp(vector_type, "256`1") || !strcmp(vector_type, "512`1") || !strcmp(vector_type, "256") || !strcmp(vector_type, "512")) + return TRUE; + if (!(cfg->opt & MONO_OPT_SIMD) && (!strcmp (vector_type, "128`1") || !strcmp (vector_type, "128") || !strcmp (vector_type, "64`1") || !strcmp (vector_type, "64"))) return TRUE; } } - return FALSE; -} -#else -void -mono_simd_decompose_intrinsic (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *ins) -{ -} -gboolean -mono_simd_unsupported_aggressive_inline_intrinsic_type (MonoMethod* cmethod) -{ return FALSE; } -#endif /*defined(TARGET_WIN32) && defined(TARGET_AMD64)*/ - #endif /* DISABLE_JIT */ -#else /* MONO_ARCH_SIMD_INTRINSICS */ - -void -mono_simd_intrinsics_init (void) -{ -} - -MonoInst* -mono_emit_simd_field_load (MonoCompile *cfg, MonoClassField *field, MonoInst *addr) -{ - return NULL; -} - -MonoInst* -mono_emit_simd_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) -{ - return NULL; -} - -MonoInst* -mono_emit_common_intrinsics (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) -{ - return NULL; -} - -void -mono_simd_decompose_intrinsic (MonoCompile *cfg, MonoBasicBlock *bb, MonoInst *ins) -{ -} - -gboolean -mono_simd_unsupported_aggressive_inline_intrinsic_type (MonoMethod* cmethod) -{ - return FALSE; -} - -#endif /* MONO_ARCH_SIMD_INTRINSICS */ - #if defined(TARGET_AMD64) void ves_icall_System_Runtime_Intrinsics_X86_X86Base___cpuidex (int abcd[4], int function_id, int subfunction_id)