@@ -161,6 +161,10 @@ void LLVMBuildUtils::init(llvm::Function *function, BlockPrototype *procedurePro
161161 reloadVariables ();
162162 reloadLists ();
163163
164+ // Mark the target as valid
165+ m_targetValidFlag = m_builder.CreateAlloca (m_builder.getInt1Ty ());
166+ m_builder.CreateStore (m_builder.getInt1 (true ), m_targetValidFlag);
167+
164168 // Create end branches
165169 m_endBranch = llvm::BasicBlock::Create (m_llvmCtx, " end" , m_function);
166170 m_endThreadBranch = llvm::BasicBlock::Create (m_llvmCtx, " endThread" , m_function);
@@ -438,6 +442,12 @@ LLVMListPtr &LLVMBuildUtils::listPtr(List *list)
438442
439443void LLVMBuildUtils::syncVariables ()
440444{
445+ llvm::BasicBlock *syncBlock = llvm::BasicBlock::Create (m_llvmCtx, " syncVariables" , m_function);
446+ llvm::BasicBlock *syncNextBlock = llvm::BasicBlock::Create (m_llvmCtx, " syncVariables.next" , m_function);
447+ m_builder.CreateCondBr (m_builder.CreateLoad (m_builder.getInt1Ty (), m_targetValidFlag), syncBlock, syncNextBlock);
448+
449+ m_builder.SetInsertPoint (syncBlock);
450+
441451 // Copy stack variables to the actual variables
442452 for (auto &[var, varPtr] : m_variablePtrs) {
443453 llvm::BasicBlock *copyBlock = llvm::BasicBlock::Create (m_llvmCtx, " syncVar" , m_function);
@@ -451,6 +461,8 @@ void LLVMBuildUtils::syncVariables()
451461
452462 m_builder.SetInsertPoint (nextBlock);
453463 }
464+
465+ m_builder.SetInsertPoint (syncNextBlock);
454466}
455467
456468void LLVMBuildUtils::reloadVariables ()
@@ -481,6 +493,11 @@ void LLVMBuildUtils::reloadLists()
481493 }
482494}
483495
496+ void LLVMBuildUtils::invalidateTarget ()
497+ {
498+ m_builder.CreateStore (m_builder.getInt1 (false ), m_targetValidFlag);
499+ }
500+
484501std::vector<LLVMIfStatement> &LLVMBuildUtils::ifStatements ()
485502{
486503 return m_ifStatements;
0 commit comments