@@ -930,17 +930,16 @@ var_types Compiler::getReturnTypeForStruct(CORINFO_CLASS_HANDLE clsHnd,
930930#elif defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64)
931931 if (structSize <= (TARGET_POINTER_SIZE * 2 ))
932932 {
933- CORINFO_FPSTRUCT_LOWERING lowering;
934- GetFpStructLowering (clsHnd, &lowering);
935- if (lowering.numLoweredElements == 1 )
933+ const CORINFO_FPSTRUCT_LOWERING* lowering = GetFpStructLowering (clsHnd);
934+ if (lowering->numLoweredElements == 1 )
936935 {
937- useType = JITtype2varType (lowering. loweredElements [0 ]);
936+ useType = JITtype2varType (lowering-> loweredElements [0 ]);
938937 assert (varTypeIsFloating (useType));
939938 howToReturnStruct = SPK_PrimitiveType;
940939 }
941- else if (!lowering. byIntegerCallConv )
940+ else if (!lowering-> byIntegerCallConv )
942941 {
943- assert (lowering. numLoweredElements == 2 );
942+ assert (lowering-> numLoweredElements == 2 );
944943 howToReturnStruct = SPK_ByValue;
945944 useType = TYP_STRUCT;
946945 }
@@ -1982,6 +1981,9 @@ void Compiler::compInit(ArenaAllocator* pAlloc,
19821981#ifdef SWIFT_SUPPORT
19831982 m_swiftLoweringCache = nullptr ;
19841983#endif
1984+ #if defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64)
1985+ m_fpStructLoweringCache = nullptr ;
1986+ #endif
19851987
19861988 // check that HelperCallProperties are initialized
19871989
@@ -8292,35 +8294,44 @@ void Compiler::GetStructTypeOffset(
82928294//
82938295// Arguments:
82948296// structHandle - type handle
8295- // pLowering - out param; returns the lowering info for the struct fields
82968297//
82978298// Return value:
8298- // None
8299- void Compiler::GetFpStructLowering (CORINFO_CLASS_HANDLE structHandle, CORINFO_FPSTRUCT_LOWERING* pLowering )
8299+ // Lowering info for the struct fields
8300+ const CORINFO_FPSTRUCT_LOWERING* Compiler::GetFpStructLowering (CORINFO_CLASS_HANDLE structHandle)
83008301{
8301- info.compCompHnd ->getFpStructLowering (structHandle, pLowering);
8302- #ifdef DEBUG
8303- if (verbose)
8304- {
8305- printf (" **** getFpStructInRegistersInfo(0x%x (%s, %u bytes)) =>\n " , dspPtr (structHandle),
8306- eeGetClassName (structHandle), info.compCompHnd ->getClassSize (structHandle));
8302+ if (m_fpStructLoweringCache == nullptr )
8303+ m_fpStructLoweringCache = new (this , CMK_CallArgs) FpStructLoweringMap (getAllocator (CMK_CallArgs));
83078304
8308- if (pLowering->byIntegerCallConv )
8309- {
8310- printf (" pass by integer calling convention\n " );
8311- }
8312- else
8305+ CORINFO_FPSTRUCT_LOWERING* lowering;
8306+ if (!m_fpStructLoweringCache->Lookup (structHandle, &lowering))
8307+ {
8308+ lowering = new (this , CMK_CallArgs) CORINFO_FPSTRUCT_LOWERING;
8309+ info.compCompHnd ->getFpStructLowering (structHandle, lowering);
8310+ m_fpStructLoweringCache->Set (structHandle, lowering);
8311+ #ifdef DEBUG
8312+ if (verbose)
83138313 {
8314- printf (" may be passed by floating-point calling convention (%zu fields):\n " ,
8315- pLowering->numLoweredElements );
8316- for (size_t i = 0 ; i < pLowering->numLoweredElements ; ++i)
8314+ printf (" **** getFpStructInRegistersInfo(0x%x (%s, %u bytes)) =>\n " , dspPtr (structHandle),
8315+ eeGetClassName (structHandle), info.compCompHnd ->getClassSize (structHandle));
8316+
8317+ if (lowering->byIntegerCallConv )
83178318 {
8318- const char * type = varTypeName (JITtype2varType (pLowering->loweredElements [i]));
8319- printf (" * field[%zu]: type %s at offset %u\n " , i, type, pLowering->offsets [i]);
8319+ printf (" pass by integer calling convention\n " );
8320+ }
8321+ else
8322+ {
8323+ printf (" may be passed by floating-point calling convention (%zu fields):\n " ,
8324+ lowering->numLoweredElements );
8325+ for (size_t i = 0 ; i < lowering->numLoweredElements ; ++i)
8326+ {
8327+ const char * type = varTypeName (JITtype2varType (lowering->loweredElements [i]));
8328+ printf (" * field[%zu]: type %s at offset %u\n " , i, type, lowering->offsets [i]);
8329+ }
83208330 }
83218331 }
8322- }
83238332#endif // DEBUG
8333+ }
8334+ return lowering;
83248335}
83258336
83268337#endif // defined(UNIX_AMD64_ABI)
0 commit comments