diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index 9b6f323fec8fb4..9894611a963450 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -3358,6 +3358,14 @@ class Compiler GenTreeCall* gtNewHelperCallNode( unsigned helper, var_types type, GenTree* arg1 = nullptr, GenTree* arg2 = nullptr, GenTree* arg3 = nullptr, GenTree* arg4 = nullptr); +#ifdef TARGET_WASM + // On wasm these helpers return void* (InitHelpers.InitClass/InitInstantiatedClass). Model them as + // value-returning so the call_indirect signature matches the compiled managed helper; the value is unused. + static constexpr var_types HelperInitClassRetType = TYP_I_IMPL; +#else + static constexpr var_types HelperInitClassRetType = TYP_VOID; +#endif // TARGET_WASM + GenTreeCall* gtNewVirtualFunctionLookupHelperCallNode( unsigned helper, var_types type, GenTree* thisPtr, GenTree* methHnd, GenTree* clsHnd = nullptr); diff --git a/src/coreclr/jit/flowgraph.cpp b/src/coreclr/jit/flowgraph.cpp index 68cbb0d2887108..ec6b7980c3a11c 100644 --- a/src/coreclr/jit/flowgraph.cpp +++ b/src/coreclr/jit/flowgraph.cpp @@ -766,7 +766,7 @@ GenTreeCall* Compiler::fgGetStaticsCCtorHelper(CORINFO_CLASS_HANDLE cls, CorInfo break; case CORINFO_HELP_INITCLASS: - type = TYP_VOID; + type = HelperInitClassRetType; break; default: diff --git a/src/coreclr/jit/importer.cpp b/src/coreclr/jit/importer.cpp index f15a3409cbd529..90396e6a294bc5 100644 --- a/src/coreclr/jit/importer.cpp +++ b/src/coreclr/jit/importer.cpp @@ -3909,7 +3909,7 @@ GenTree* Compiler::impInitClass(CORINFO_RESOLVED_TOKEN* pResolvedToken) if (runtimeLookup) { - node = gtNewHelperCallNode(CORINFO_HELP_INITCLASS, TYP_VOID, node); + node = gtNewHelperCallNode(CORINFO_HELP_INITCLASS, HelperInitClassRetType, node); } else { diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index e7d6da0e5c1719..76579dbf14bc71 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -14674,21 +14674,22 @@ GenTree* Compiler::fgInitThisClass() vtTree = gtNewMethodTableLookup(vtTree); GenTree* methodHnd = gtNewIconEmbMethHndNode(info.compMethodHnd); - return gtNewHelperCallNode(CORINFO_HELP_INITINSTCLASS, TYP_VOID, vtTree, methodHnd); + return gtNewHelperCallNode(CORINFO_HELP_INITINSTCLASS, HelperInitClassRetType, vtTree, methodHnd); } case CORINFO_LOOKUP_CLASSPARAM: { GenTree* vtTree = gtNewLclvNode(info.compTypeCtxtArg, TYP_I_IMPL); vtTree->gtFlags |= GTF_VAR_CONTEXT; - return gtNewHelperCallNode(CORINFO_HELP_INITCLASS, TYP_VOID, vtTree); + return gtNewHelperCallNode(CORINFO_HELP_INITCLASS, HelperInitClassRetType, vtTree); } case CORINFO_LOOKUP_METHODPARAM: { GenTree* methHndTree = gtNewLclvNode(info.compTypeCtxtArg, TYP_I_IMPL); methHndTree->gtFlags |= GTF_VAR_CONTEXT; - return gtNewHelperCallNode(CORINFO_HELP_INITINSTCLASS, TYP_VOID, gtNewIconNode(0), methHndTree); + return gtNewHelperCallNode(CORINFO_HELP_INITINSTCLASS, HelperInitClassRetType, gtNewIconNode(0), + methHndTree); } default: