Skip to content

Commit

Permalink
Don't zero-initialize CORINFO_FPSTRUCT_LOWERING
Browse files Browse the repository at this point in the history
  • Loading branch information
tomeksowi committed Jul 12, 2024
1 parent d4be92c commit 823df8b
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 36 deletions.
2 changes: 0 additions & 2 deletions src/coreclr/inc/corinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -1934,11 +1934,9 @@ struct CORINFO_SWIFT_LOWERING
#define MAX_FPSTRUCT_LOWERED_ELEMENTS 2

// Lowering information on fields of a struct passed by hardware floating-point calling convention on RISC-V and LoongArch
// NOTE: all array elements past numLoweredElements are zero-initialized
struct CORINFO_FPSTRUCT_LOWERING
{
// Whether the struct should be passed by integer calling convention (cannot be passed by FP calling convention).
// If true, all other fields of CORINFO_FPSTRUCT_LOWERING are zeroed.
bool byIntegerCallConv;
// Types of lowered struct fields.
CorInfoType loweredElements[MAX_FPSTRUCT_LOWERED_ELEMENTS];
Expand Down
23 changes: 13 additions & 10 deletions src/coreclr/jit/compiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -931,17 +931,20 @@ var_types Compiler::getReturnTypeForStruct(CORINFO_CLASS_HANDLE clsHnd,
if (structSize <= (TARGET_POINTER_SIZE * 2))
{
const CORINFO_FPSTRUCT_LOWERING* lowering = GetFpStructLowering(clsHnd);
if (lowering->numLoweredElements == 1)
if (!lowering->byIntegerCallConv)
{
useType = JITtype2varType(lowering->loweredElements[0]);
assert(varTypeIsFloating(useType));
howToReturnStruct = SPK_PrimitiveType;
}
else if (!lowering->byIntegerCallConv)
{
assert(lowering->numLoweredElements == 2);
howToReturnStruct = SPK_ByValue;
useType = TYP_STRUCT;
if (lowering->numLoweredElements == 1)
{
useType = JITtype2varType(lowering->loweredElements[0]);
assert(varTypeIsFloating(useType));
howToReturnStruct = SPK_PrimitiveType;
}
else
{
assert(lowering->numLoweredElements == 2);
howToReturnStruct = SPK_ByValue;
useType = TYP_STRUCT;
}
}
}

Expand Down
20 changes: 11 additions & 9 deletions src/coreclr/jit/targetriscv64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,17 +73,19 @@ ABIPassingInformation RiscV64Classifier::Classify(Compiler* comp,
else if (!structLayout->IsBlockLayout())
{
lowering = comp->GetFpStructLowering(structLayout->GetClassHandle());
assert((lowering->numLoweredElements > 0) == !lowering->byIntegerCallConv);
assert(lowering->numLoweredElements <= 2);
INDEBUG(unsigned debugIntFields = 0;)
for (size_t i = 0; i < lowering->numLoweredElements; ++i)
if (!lowering->byIntegerCallConv)
{
var_types type = JITtype2varType(lowering->loweredElements[i]);
floatFields += (unsigned)varTypeIsFloating(type);
INDEBUG(debugIntFields += (unsigned)varTypeIsIntegralOrI(type);)
assert((lowering->numLoweredElements == 1) || (lowering->numLoweredElements == 2));
INDEBUG(unsigned debugIntFields = 0;)
for (size_t i = 0; i < lowering->numLoweredElements; ++i)
{
var_types type = JITtype2varType(lowering->loweredElements[i]);
floatFields += (unsigned)varTypeIsFloating(type);
INDEBUG(debugIntFields += (unsigned)varTypeIsIntegralOrI(type);)
}
intFields = lowering->numLoweredElements - floatFields;
assert(debugIntFields == intFields);
}
intFields = lowering->numLoweredElements - floatFields;
assert(debugIntFields == intFields);
}
}
else
Expand Down
8 changes: 3 additions & 5 deletions src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3460,12 +3460,10 @@ private void getFpStructLowering(CORINFO_CLASS_STRUCT_* structHnd, ref CORINFO_F
HandleToObject(structHnd), _compilation.TypeSystemContext.Target.Architecture);
if (info.flags != FpStruct.UseIntCallConv)
{
lowering = new CORINFO_FPSTRUCT_LOWERING {
byIntegerCallConv = false,
numLoweredElements = ((info.flags & FpStruct.OnlyOne) != 0) ? 1 : 2,
};
lowering.byIntegerCallConv = false;
lowering.Offsets[0] = info.offset1st;
lowering.Offsets[1] = info.offset2nd;
lowering.numLoweredElements = ((info.flags & FpStruct.OnlyOne) != 0) ? 1 : 2;

if ((info.flags & (FpStruct.BothFloat | FpStruct.FloatInt | FpStruct.OnlyOne)) != 0)
lowering.LoweredElements[0] = (info.SizeShift1st() == 3) ? CorInfoType.CORINFO_TYPE_DOUBLE : CorInfoType.CORINFO_TYPE_FLOAT;
Expand All @@ -3488,7 +3486,7 @@ private void getFpStructLowering(CORINFO_CLASS_STRUCT_* structHnd, ref CORINFO_F
}
else
{
lowering = new CORINFO_FPSTRUCT_LOWERING{ byIntegerCallConv = true };
lowering.byIntegerCallConv = true;
}
}

Expand Down
14 changes: 10 additions & 4 deletions src/coreclr/tools/superpmi/superpmi-shared/methodcontext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6337,9 +6337,12 @@ void MethodContext::dmpGetSwiftLowering(
{
printf("GetSwiftLowering key structHnd-%016" PRIX64 ", value byReference-%u numLoweredElements-%u", key,
value.byReference, value.numLoweredElements);
for (size_t i = 0; i < value.numLoweredElements; i++)
if (!value.byReference)
{
printf(" [%zu] %u", i, value.loweredElements[i]);
for (size_t i = 0; i < value.numLoweredElements; i++)
{
printf(" [%zu] %u", i, value.loweredElements[i]);
}
}
}
void MethodContext::repGetSwiftLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_SWIFT_LOWERING* pLowering)
Expand Down Expand Up @@ -6387,9 +6390,12 @@ void MethodContext::dmpGetFpStructLowering(
{
printf("GetFpStructLowering key structHnd-%016" PRIX64 ", value byIntegerCallConv-%u numLoweredElements-%u", key,
value.byIntegerCallConv, value.numLoweredElements);
for (size_t i = 0; i < value.numLoweredElements; i++)
if (!value.byIntegerCallConv)
{
printf(" [%zu] %u", i, value.loweredElements[i]);
for (size_t i = 0; i < value.numLoweredElements; i++)
{
printf(" [%zu] %u", i, value.loweredElements[i]);
}
}
}
void MethodContext::repGetFpStructLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_FPSTRUCT_LOWERING* pLowering)
Expand Down
11 changes: 5 additions & 6 deletions src/coreclr/vm/jitinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9535,11 +9535,10 @@ void CEEInfo::getFpStructLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_FPSTRU
FpStructInRegistersInfo info = MethodTable::GetFpStructInRegistersInfo(TypeHandle(structHnd));
if (info.flags != FpStruct::UseIntCallConv)
{
*pLowering = {
.byIntegerCallConv = false,
.offsets = { info.offset1st, info.offset2nd },
.numLoweredElements = (info.flags & FpStruct::OnlyOne) ? 1ul : 2ul,
};
pLowering->byIntegerCallConv = false;
pLowering->offsets[0] = info.offset1st;
pLowering->offsets[1] = info.offset2nd;
pLowering->numLoweredElements = (info.flags & FpStruct::OnlyOne) ? 1ul : 2ul;

if (info.flags & (FpStruct::BothFloat | FpStruct::FloatInt | FpStruct::OnlyOne))
pLowering->loweredElements[0] = (info.SizeShift1st() == 3) ? CORINFO_TYPE_DOUBLE : CORINFO_TYPE_FLOAT;
Expand All @@ -9562,7 +9561,7 @@ void CEEInfo::getFpStructLowering(CORINFO_CLASS_HANDLE structHnd, CORINFO_FPSTRU
}
else
{
*pLowering = { .byIntegerCallConv = true };
pLowering->byIntegerCallConv = true;
}
#endif // TARGET_RISCV64 || TARGET_LOONGARCH64

Expand Down

0 comments on commit 823df8b

Please sign in to comment.