1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 20:42:21 +02:00

Fixed some constant evaluation issues with 'while' statement

This commit is contained in:
Brian Fiete 2020-05-04 17:32:03 -07:00
parent 2cd37ef6c6
commit dedaf989a6

View file

@ -5230,12 +5230,18 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
}
bool isInfiniteLoop = false;
bool isFalseLoop = false;
if (checkVal.mValue.IsConst())
{
mBfIRBuilder->CreateEnsureInstructionAt();
auto constVal = mBfIRBuilder->GetConstantById(checkVal.mValue.mId);
if (constVal->mTypeCode == BfTypeCode_Boolean)
{
isInfiniteLoop = constVal->mBool;
isFalseLoop = !isInfiniteLoop;
}
}
// We may have a call in the loop body
@ -5254,7 +5260,13 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
mBfIRBuilder->SetInsertPoint(bodyBB);
if (whileStmt->mEmbeddedStatement != NULL)
{
VisitEmbeddedStatement(whileStmt->mEmbeddedStatement);
if (isFalseLoop)
{
SetAndRestoreValue<bool> ignoreWrites(mBfIRBuilder->mIgnoreWrites, true);
VisitEmbeddedStatement(whileStmt->mEmbeddedStatement);
}
else
VisitEmbeddedStatement(whileStmt->mEmbeddedStatement);
}
else
{
@ -5264,10 +5276,18 @@ void BfModule::Visit(BfWhileStatement* whileStmt)
{
isInfiniteLoop = false;
}
if (!mCurMethodState->mLeftBlockUncond)
if (!isFalseLoop)
{
mBfIRBuilder->CreateBr(condBB);
}
if (!mCurMethodState->mLeftBlockUncond)
{
mBfIRBuilder->CreateBr(condBB);
}
}
if (!isInfiniteLoop)
mCurMethodState->mHadReturn = false;
mCurMethodState->mLeftBlockUncond = false;
mCurMethodState->mLeftBlockCond = false;