mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-11 12:54:15 +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);
|
UpdateSrcPos(whileStmt);
|
||||||
|
|
||||||
|
bool prevHadReturn = mCurMethodState->mHadReturn;
|
||||||
|
|
||||||
auto condBB = mBfIRBuilder->CreateBlock("while.cond");
|
auto condBB = mBfIRBuilder->CreateBlock("while.cond");
|
||||||
auto bodyBB = mBfIRBuilder->CreateBlock("while.body");
|
auto bodyBB = mBfIRBuilder->CreateBlock("while.body");
|
||||||
auto endBB = mBfIRBuilder->CreateBlock("while.end");
|
auto endBB = mBfIRBuilder->CreateBlock("while.end");
|
||||||
|
@ -5247,7 +5249,13 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
|
||||||
// We may have a call in the loop body
|
// We may have a call in the loop body
|
||||||
mCurMethodState->mMayNeedThisAccessCheck = true;
|
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
|
// Apply deferred local assign to mEmbeddedStatement and itrStmt
|
||||||
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
|
BfDeferredLocalAssignData deferredLocalAssignData(mCurMethodState->mCurScope);
|
||||||
|
@ -5276,17 +5284,14 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
|
||||||
{
|
{
|
||||||
isInfiniteLoop = false;
|
isInfiniteLoop = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isFalseLoop)
|
if ((!mCurMethodState->mLeftBlockUncond) && (!isFalseLoop))
|
||||||
{
|
{
|
||||||
if (!mCurMethodState->mLeftBlockUncond)
|
mBfIRBuilder->CreateBr(condBB);
|
||||||
{
|
}
|
||||||
mBfIRBuilder->CreateBr(condBB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isInfiniteLoop)
|
if (!isInfiniteLoop)
|
||||||
mCurMethodState->mHadReturn = false;
|
mCurMethodState->mHadReturn = prevHadReturn;
|
||||||
|
|
||||||
mCurMethodState->mLeftBlockUncond = false;
|
mCurMethodState->mLeftBlockUncond = false;
|
||||||
mCurMethodState->mLeftBlockCond = false;
|
mCurMethodState->mLeftBlockCond = false;
|
||||||
|
@ -5294,6 +5299,11 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
|
||||||
mBfIRBuilder->AddBlock(endBB);
|
mBfIRBuilder->AddBlock(endBB);
|
||||||
mBfIRBuilder->SetInsertPoint(endBB);
|
mBfIRBuilder->SetInsertPoint(endBB);
|
||||||
|
|
||||||
|
if (isFalseLoop)
|
||||||
|
{
|
||||||
|
mBfIRBuilder->EraseFromParent(bodyBB);
|
||||||
|
}
|
||||||
|
|
||||||
RestoreScopeState();
|
RestoreScopeState();
|
||||||
|
|
||||||
if ((isInfiniteLoop) && (mCurMethodInstance != NULL))
|
if ((isInfiniteLoop) && (mCurMethodInstance != NULL))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue