mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 03:28:20 +02:00
Better union field loading
This commit is contained in:
parent
d2356a0582
commit
03c56b42c9
1 changed files with 8 additions and 8 deletions
|
@ -5319,11 +5319,8 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
|
|||
return mModule->GetDefaultTypedValue(resolvedFieldType);
|
||||
}
|
||||
|
||||
if ((target.mType->IsUnion()) && (!target.mType->IsValuelessType()))
|
||||
target = mModule->MakeAddressable(target);
|
||||
|
||||
BfTypedValue retVal;
|
||||
if (target.IsSplat())
|
||||
if (targetValue.IsSplat())
|
||||
{
|
||||
retVal = mModule->ExtractValue(targetValue, fieldInstance, fieldInstance->mDataIdx);
|
||||
}
|
||||
|
@ -5351,15 +5348,18 @@ BfTypedValue BfExprEvaluator::LoadField(BfAstNode* targetSrc, BfTypedValue targe
|
|||
resolvedFieldType, target.IsReadOnly() ? BfTypedValueKind_ReadOnlyAddr : BfTypedValueKind_Addr);
|
||||
}
|
||||
}
|
||||
|
||||
if (!retVal.IsSplat())
|
||||
|
||||
if (typeInstance->mIsUnion)
|
||||
{
|
||||
if (typeInstance->mIsUnion)
|
||||
auto unionInnerType = typeInstance->GetUnionInnerType();
|
||||
if (unionInnerType != resolvedFieldType)
|
||||
{
|
||||
if (!retVal.IsAddr())
|
||||
retVal = mModule->MakeAddressable(retVal);
|
||||
BfIRType llvmPtrType = mModule->mBfIRBuilder->GetPointerTo(mModule->mBfIRBuilder->MapType(resolvedFieldType));
|
||||
retVal.mValue = mModule->mBfIRBuilder->CreateBitCast(retVal.mValue, llvmPtrType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((fieldDef->mIsVolatile) && (retVal.IsAddr()))
|
||||
retVal.mKind = BfTypedValueKind_VolatileAddr;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue