1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +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

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