mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 20:42:21 +02:00
More fixed to while statement
This commit is contained in:
parent
3bc83157e7
commit
13b5359458
1 changed files with 19 additions and 9 deletions
|
@ -5191,6 +5191,8 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
|
|||
{
|
||||
UpdateSrcPos(whileStmt);
|
||||
|
||||
bool prevHadReturn = mCurMethodState->mHadReturn;
|
||||
|
||||
auto condBB = mBfIRBuilder->CreateBlock("while.cond");
|
||||
auto bodyBB = mBfIRBuilder->CreateBlock("while.body");
|
||||
auto endBB = mBfIRBuilder->CreateBlock("while.end");
|
||||
|
@ -5247,7 +5249,13 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
|
|||
// We may have a call in the loop body
|
||||
mCurMethodState->mMayNeedThisAccessCheck = true;
|
||||
|
||||
mBfIRBuilder->CreateCondBr(checkVal.mValue, bodyBB, endBB);
|
||||
// For BeefBackend we continue to do CondBr because it helps our flow analysis and we optimize it anyway
|
||||
if ((isInfiniteLoop) && (!IsTargetingBeefBackend()))
|
||||
mBfIRBuilder->CreateBr(bodyBB);
|
||||
else if ((isFalseLoop) && (!IsTargetingBeefBackend()))
|
||||
mBfIRBuilder->CreateBr(endBB);
|
||||
else
|
||||
mBfIRBuilder->CreateCondBr(checkVal.mValue, bodyBB, endBB);
|
||||
|
||||
// Apply deferred local assign to mEmbeddedStatement and itrStmt
|
||||
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
|
||||
|
@ -5276,17 +5284,14 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
|
|||
{
|
||||
isInfiniteLoop = false;
|
||||
}
|
||||
|
||||
if (!isFalseLoop)
|
||||
|
||||
if ((!mCurMethodState->mLeftBlockUncond) && (!isFalseLoop))
|
||||
{
|
||||
if (!mCurMethodState->mLeftBlockUncond)
|
||||
{
|
||||
mBfIRBuilder->CreateBr(condBB);
|
||||
}
|
||||
}
|
||||
mBfIRBuilder->CreateBr(condBB);
|
||||
}
|
||||
|
||||
if (!isInfiniteLoop)
|
||||
mCurMethodState->mHadReturn = false;
|
||||
mCurMethodState->mHadReturn = prevHadReturn;
|
||||
|
||||
mCurMethodState->mLeftBlockUncond = false;
|
||||
mCurMethodState->mLeftBlockCond = false;
|
||||
|
@ -5294,6 +5299,11 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
|
|||
mBfIRBuilder->AddBlock(endBB);
|
||||
mBfIRBuilder->SetInsertPoint(endBB);
|
||||
|
||||
if (isFalseLoop)
|
||||
{
|
||||
mBfIRBuilder->EraseFromParent(bodyBB);
|
||||
}
|
||||
|
||||
RestoreScopeState();
|
||||
|
||||
if ((isInfiniteLoop) && (mCurMethodInstance != NULL))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue