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:
parent
748f7b8e49
commit
d40f7fa759
2 changed files with 13 additions and 14 deletions
|
@ -606,7 +606,7 @@ public:
|
||||||
{
|
{
|
||||||
return (mKind <= BeMCInstKind_Unwind_SetBP);
|
return (mKind <= BeMCInstKind_Unwind_SetBP);
|
||||||
}
|
}
|
||||||
|
|
||||||
BeMCOperand* GetDest()
|
BeMCOperand* GetDest()
|
||||||
{
|
{
|
||||||
if (mResult)
|
if (mResult)
|
||||||
|
|
|
@ -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,8 +4584,14 @@ 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();
|
||||||
mBfIRBuilder->CreateBr(endBlock);
|
//TODO: This masks a bug in our backend
|
||||||
|
if (IsTargetingBeefBackend())
|
||||||
|
mBfIRBuilder->CreateBr(endBlock);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
mBfIRBuilder->CreateBr(endBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isComprehensive)
|
if (isComprehensive)
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue