[mono][aot] Avoid emitting gshared methods multiple times when preferring instances...
authorZoltan Varga <vargaz@gmail.com>
Thu, 5 Jan 2023 21:29:47 +0000 (16:29 -0500)
committerGitHub <noreply@github.com>
Thu, 5 Jan 2023 21:29:47 +0000 (16:29 -0500)
This fixes a part of the size regression added by c7c6aa032175f4ee48c38757d1d9f32df25f02c6.

src/mono/mono/mini/aot-compiler.c

index b8682fa5798c41368ce1528b385b06ec8ac495b2..05e2beecd539c3d8965aa3c79544fa068035e0f9 100644 (file)
@@ -4346,9 +4346,11 @@ add_extra_method_full (MonoAotCompile *acfg, MonoMethod *method, gboolean prefer
                        return;
                }
 
-               if (g_hash_table_lookup (acfg->prefer_instances, method))
-                       /* Compile an instance as well */
+               if (g_hash_table_lookup (acfg->prefer_instances, method) && !is_open_method (orig)) {
+                       /* Compile an instance instead */
                        add_extra_method_full (acfg, orig, FALSE, depth);
+                       return;
+               }
 
                /* Add it to profile_methods so its not skipped later */
                if (acfg->aot_opts.profile_only && g_hash_table_lookup (acfg->profile_methods, orig))
@@ -9282,6 +9284,7 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method)
                 * for performance reasons, since gshared methods cannot implement some
                 * features like static virtual methods efficiently.
                 */
+               /* Instances encountered later will be handled in add_extra_method_full () */
                g_hash_table_insert (acfg->prefer_instances, method, method);
                GPtrArray *instances = g_hash_table_lookup (acfg->gshared_instances, method);
                if (instances) {