@@ -81,6 +81,7 @@ void LLVMBuildUtils::init(llvm::Function *function, BlockPrototype *procedurePro
8181
8282 // Store variables locally to enable optimizations
8383 varPtr.stackPtr = m_builder.CreateAlloca (m_valueDataType);
84+ varPtr.changed = m_builder.CreateAlloca (m_builder.getInt1Ty ());
8485
8586 // Integer support
8687 varPtr.isInt = m_builder.CreateAlloca (m_builder.getInt1Ty (), nullptr , var->name () + " .isInt" );
@@ -341,8 +342,18 @@ LLVMListPtr &LLVMBuildUtils::listPtr(List *list)
341342void LLVMBuildUtils::syncVariables ()
342343{
343344 // Copy stack variables to the actual variables
344- for (auto &[var, varPtr] : m_variablePtrs)
345+ for (auto &[var, varPtr] : m_variablePtrs) {
346+ llvm::BasicBlock *copyBlock = llvm::BasicBlock::Create (m_llvmCtx, " syncVar" , m_function);
347+ llvm::BasicBlock *nextBlock = llvm::BasicBlock::Create (m_llvmCtx, " syncVar.next" , m_function);
348+ m_builder.CreateCondBr (m_builder.CreateLoad (m_builder.getInt1Ty (), varPtr.changed ), copyBlock, nextBlock);
349+
350+ m_builder.SetInsertPoint (copyBlock);
345351 createValueCopy (varPtr.stackPtr , getVariablePtr (m_targetVariables, var));
352+ m_builder.CreateStore (m_builder.getInt1 (false ), varPtr.changed );
353+ m_builder.CreateBr (nextBlock);
354+
355+ m_builder.SetInsertPoint (nextBlock);
356+ }
346357}
347358
348359void LLVMBuildUtils::reloadVariables ()
@@ -352,6 +363,7 @@ void LLVMBuildUtils::reloadVariables()
352363 llvm::Value *ptr = getVariablePtr (m_targetVariables, var);
353364 createValueCopy (ptr, varPtr.stackPtr );
354365 m_builder.CreateStore (m_builder.getInt1 (false ), varPtr.isInt );
366+ m_builder.CreateStore (m_builder.getInt1 (false ), varPtr.changed );
355367 }
356368}
357369
0 commit comments