@@ -66,16 +66,10 @@ void LLVMBuildUtils::init(llvm::Function *function, BlockPrototype *procedurePro
6666 // Create variable pointers
6767 for (auto &[var, varPtr] : m_variablePtrs) {
6868 llvm::Value *ptr = getVariablePtr (m_targetVariables, var);
69-
70- // Direct access
7169 varPtr.heapPtr = ptr;
7270
73- // In warp scripts, all variables are created on the stack and synced later (seems to be faster)
74- // NOTE: Strings are NOT copied, only the pointer is copied
75- varPtr.onStack = m_warp;
76-
77- if (varPtr.onStack )
78- varPtr.stackPtr = m_builder.CreateAlloca (m_valueDataType);
71+ // Store variables locally to enable optimizations
72+ varPtr.stackPtr = m_builder.CreateAlloca (m_valueDataType);
7973 }
8074
8175 // Create list pointers
@@ -101,7 +95,7 @@ void LLVMBuildUtils::init(llvm::Function *function, BlockPrototype *procedurePro
10195 }
10296 }
10397
104- reloadVariables (m_targetVariables );
98+ reloadVariables ();
10599 reloadLists ();
106100
107101 // Create end branch
@@ -116,7 +110,7 @@ void LLVMBuildUtils::end(LLVMInstruction *lastInstruction, LLVMRegister *lastCon
116110 m_builder.CreateBr (m_endBranch);
117111
118112 m_builder.SetInsertPoint (m_endBranch);
119- syncVariables (m_targetVariables );
113+ syncVariables ();
120114
121115 // End the script function
122116 llvm::PointerType *pointerType = llvm::PointerType::get (llvm::Type::getInt8Ty (m_llvmCtx), 0 );
@@ -309,25 +303,19 @@ LLVMListPtr &LLVMBuildUtils::listPtr(List *list)
309303 return m_listPtrs[list];
310304}
311305
312- void LLVMBuildUtils::syncVariables (llvm::Value *targetVariables )
306+ void LLVMBuildUtils::syncVariables ()
313307{
314308 // Copy stack variables to the actual variables
315- for (auto &[var, varPtr] : m_variablePtrs) {
316- if (varPtr.onStack )
317- createValueCopy (varPtr.stackPtr , getVariablePtr (targetVariables, var));
318- }
309+ for (auto &[var, varPtr] : m_variablePtrs)
310+ createValueCopy (varPtr.stackPtr , getVariablePtr (m_targetVariables, var));
319311}
320312
321- void LLVMBuildUtils::reloadVariables (llvm::Value *targetVariables )
313+ void LLVMBuildUtils::reloadVariables ()
322314{
323315 // Load variables to stack
324- if (m_warp) {
325- for (auto &[var, varPtr] : m_variablePtrs) {
326- if (varPtr.onStack ) {
327- llvm::Value *ptr = getVariablePtr (m_targetVariables, var);
328- createValueCopy (ptr, varPtr.stackPtr );
329- }
330- }
316+ for (auto &[var, varPtr] : m_variablePtrs) {
317+ llvm::Value *ptr = getVariablePtr (m_targetVariables, var);
318+ createValueCopy (ptr, varPtr.stackPtr );
331319 }
332320}
333321
@@ -449,7 +437,7 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
449437
450438 if (isSingleType (targetType)) {
451439 // Handle multiple source type cases with runtime switch
452- typePtr = m_builder. CreateStructGEP (m_valueDataType, reg-> value , 1 );
440+ typePtr = getValueTypePtr ( reg);
453441 loadedType = m_builder.CreateLoad (m_builder.getInt32Ty (), typePtr);
454442
455443 mergeBlock = llvm::BasicBlock::Create (m_llvmCtx, " merge" , m_function);
@@ -651,7 +639,7 @@ llvm::Value *LLVMBuildUtils::removeNaN(llvm::Value *num)
651639 return m_builder.CreateSelect (isNaN (num), llvm::ConstantFP::get (m_llvmCtx, llvm::APFloat (0.0 )), num);
652640}
653641
654- void LLVMBuildUtils::createValueStore (LLVMRegister *reg , llvm::Value *destPtr , Compiler::StaticType destType, Compiler::StaticType targetType)
642+ void LLVMBuildUtils::createValueStore (llvm::Value *destPtr , llvm::Value *destTypePtr, LLVMRegister *reg , Compiler::StaticType destType, Compiler::StaticType targetType)
655643{
656644 llvm::Value *targetPtr = nullptr ;
657645 const bool targetTypeIsSingle = isSingleType (targetType);
@@ -670,11 +658,10 @@ void LLVMBuildUtils::createValueStore(LLVMRegister *reg, llvm::Value *destPtr, C
670658 loadedTargetType = m_builder.getInt32 (static_cast <uint32_t >(mappedType));
671659 else {
672660 assert (!reg->isConst ());
673- llvm::Value *targetTypePtr = m_builder. CreateStructGEP (m_valueDataType, reg-> value , 1 );
661+ llvm::Value *targetTypePtr = getValueTypePtr ( reg);
674662 loadedTargetType = m_builder.CreateLoad (m_builder.getInt32Ty (), targetTypePtr);
675663 }
676664
677- llvm::Value *destTypePtr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 1 );
678665 llvm::Value *loadedDestType = m_builder.CreateLoad (m_builder.getInt32Ty (), destTypePtr);
679666
680667 llvm::BasicBlock *mergeBlock = llvm::BasicBlock::Create (m_llvmCtx, " merge" , m_function);
@@ -723,8 +710,7 @@ void LLVMBuildUtils::createValueStore(LLVMRegister *reg, llvm::Value *destPtr, C
723710 // Write bool to number value directly and change type
724711 llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 0 );
725712 m_builder.CreateStore (targetPtr, ptr);
726- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 1 );
727- m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Bool)), typePtr);
713+ m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Bool)), destTypePtr);
728714 m_builder.CreateBr (mergeBlock);
729715 }
730716
@@ -744,8 +730,7 @@ void LLVMBuildUtils::createValueStore(LLVMRegister *reg, llvm::Value *destPtr, C
744730 llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 0 );
745731 llvm::Value *destStringPtr = m_builder.CreateCall (m_functions.resolve_string_pool_new (), m_builder.getInt1 (false ));
746732
747- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 1 );
748- m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::String)), typePtr);
733+ m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::String)), destTypePtr);
749734 m_builder.CreateStore (destStringPtr, ptr);
750735 m_builder.CreateCall (m_functions.resolve_string_assign (), { destStringPtr, targetPtr });
751736
@@ -775,9 +760,8 @@ void LLVMBuildUtils::createValueStore(LLVMRegister *reg, llvm::Value *destPtr, C
775760
776761 // Write number to bool value directly and change type
777762 llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 0 );
778- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 1 );
779763 m_builder.CreateStore (targetPtr, ptr);
780- m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Number)), typePtr );
764+ m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Number)), destTypePtr );
781765 m_builder.CreateBr (mergeBlock);
782766 }
783767
@@ -815,8 +799,7 @@ void LLVMBuildUtils::createValueStore(LLVMRegister *reg, llvm::Value *destPtr, C
815799 llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 0 );
816800 llvm::Value *destStringPtr = m_builder.CreateCall (m_functions.resolve_string_pool_new (), m_builder.getInt1 (false ));
817801
818- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 1 );
819- m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::String)), typePtr);
802+ m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::String)), destTypePtr);
820803 m_builder.CreateStore (destStringPtr, ptr);
821804 m_builder.CreateCall (m_functions.resolve_string_assign (), { destStringPtr, targetPtr });
822805
@@ -849,8 +832,7 @@ void LLVMBuildUtils::createValueStore(LLVMRegister *reg, llvm::Value *destPtr, C
849832 llvm::Value *destStringPtr = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
850833 m_builder.CreateCall (m_functions.resolve_string_pool_free (), destStringPtr);
851834 m_builder.CreateStore (targetPtr, ptr);
852- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 1 );
853- m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Number)), typePtr);
835+ m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Number)), destTypePtr);
854836 m_builder.CreateBr (mergeBlock);
855837 }
856838
@@ -871,8 +853,7 @@ void LLVMBuildUtils::createValueStore(LLVMRegister *reg, llvm::Value *destPtr, C
871853 llvm::Value *destStringPtr = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
872854 m_builder.CreateCall (m_functions.resolve_string_pool_free (), destStringPtr);
873855 m_builder.CreateStore (targetPtr, ptr);
874- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, destPtr, 1 );
875- m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Bool)), typePtr);
856+ m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Bool)), destTypePtr);
876857 m_builder.CreateBr (mergeBlock);
877858 }
878859
@@ -903,10 +884,23 @@ void LLVMBuildUtils::createValueStore(LLVMRegister *reg, llvm::Value *destPtr, C
903884 m_builder.SetInsertPoint (mergeBlock);
904885}
905886
906- void LLVMBuildUtils::createValueStore (LLVMRegister *reg , llvm::Value *destPtr , Compiler::StaticType targetType)
887+ void LLVMBuildUtils::createValueStore (llvm::Value *destPtr , llvm::Value *destTypePtr, LLVMRegister *reg , Compiler::StaticType targetType)
907888{
908889 // Same as createValueStore(), but the destination type is unknown at compile time
909- createValueStore (reg, destPtr, Compiler::StaticType::Unknown, targetType);
890+ createValueStore (destPtr, destTypePtr, reg, Compiler::StaticType::Unknown, targetType);
891+ }
892+
893+ llvm::Value *LLVMBuildUtils::getValueTypePtr (llvm::Value *value)
894+ {
895+ return m_builder.CreateStructGEP (m_valueDataType, value, 1 );
896+ }
897+
898+ llvm::Value *LLVMBuildUtils::getValueTypePtr (LLVMRegister *reg)
899+ {
900+ if (reg->typeVar )
901+ return reg->typeVar ;
902+ else
903+ return getValueTypePtr (reg->value );
910904}
911905
912906llvm::Value *LLVMBuildUtils::getListSize (const LLVMListPtr &listPtr)
@@ -1018,7 +1012,7 @@ llvm::Value *LLVMBuildUtils::createValue(LLVMRegister *reg)
10181012 }
10191013
10201014 // Store type
1021- llvm::Value *typeField = m_builder. CreateStructGEP (m_valueDataType, ret, 1 );
1015+ llvm::Value *typeField = getValueTypePtr ( ret);
10221016 ValueType type = it->first ;
10231017 m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(type)), typeField);
10241018
@@ -1272,9 +1266,9 @@ void LLVMBuildUtils::createSuspend()
12721266 m_builder.SetInsertPoint (suspendBranch);
12731267 }
12741268
1275- syncVariables (m_targetVariables );
1269+ syncVariables ();
12761270 m_coroutine->createSuspend ();
1277- reloadVariables (m_targetVariables );
1271+ reloadVariables ();
12781272 reloadLists ();
12791273
12801274 if (m_warpArg) {
0 commit comments