1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

More fixes for switch unreachable

This commit is contained in:
Brian Fiete 2020-02-21 15:34:08 -08:00
parent 748f7b8e49
commit d40f7fa759
2 changed files with 13 additions and 14 deletions

View file

@ -606,7 +606,7 @@ public:
{
return (mKind <= BeMCInstKind_Unwind_SetBP);
}
BeMCOperand* GetDest()
{
if (mResult)

View file

@ -4040,10 +4040,9 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
}
defaultBlock = mBfIRBuilder->CreateBlock("default");
if (switchStmt->mDefaultCase != NULL)
{
blocks.push_back(defaultBlock);
}
bool hasDefaultCase = switchStmt->mDefaultCase != NULL;
if (hasDefaultCase)
blocks.push_back(defaultBlock);
SizedArray<BfDeferredLocalAssignData, 8> deferredLocalAssignDataVec;
deferredLocalAssignDataVec.resize(blocks.size());
@ -4585,8 +4584,14 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
mBfIRBuilder->AddBlock(defaultBlock);
mBfIRBuilder->SetInsertPoint(defaultBlock);
if (isComprehensive)
{
mBfIRBuilder->CreateUnreachable();
mBfIRBuilder->CreateBr(endBlock);
//TODO: This masks a bug in our backend
if (IsTargetingBeefBackend())
mBfIRBuilder->CreateBr(endBlock);
}
else
mBfIRBuilder->CreateBr(endBlock);
}
if (isComprehensive)
@ -4601,12 +4606,6 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
if (deferredLocalAssignData->mHadFallthrough)
continue;
// if ((deferredLocalAssignData->mHadFallthrough) && (blockIdx < (int)blocks.size() - 1))
// {
// auto nextDeferredLocalAssignData = &deferredLocalAssignDataVec[blockIdx + 1];
// deferredLocalAssignData->SetUnion(*nextDeferredLocalAssignData);
// }
if (mergedDeferredLocalAssignData == NULL)
mergedDeferredLocalAssignData = deferredLocalAssignData;
else
@ -4618,12 +4617,12 @@ void BfModule::Visit(BfSwitchStatement* switchStmt)
}
if ((caseCount > 0) && (allHadReturns) &&
((defaultBlock != endBlock) || (isComprehensive)))
((hasDefaultCase) || (isComprehensive)))
{
mCurMethodState->SetHadReturn(true);
mCurMethodState->mLeftBlockUncond = true;
if ((defaultBlock != endBlock) && (switchStmt->mDefaultCase != NULL))
if ((!hasDefaultCase) && (!isComprehensive))
mBfIRBuilder->DeleteBlock(endBlock);
else
{