@@ -523,14 +523,14 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
523523 // If there's enough space, use the allocated memory
524524 m_builder.SetInsertPoint (ifBlock);
525525 llvm::Value *itemPtr = getListItem (listPtr, size, func);
526- createInitialValueStore (arg.second , itemPtr, type);
526+ createReusedValueStore (arg.second , itemPtr, type);
527527 m_builder.CreateStore (m_builder.CreateAdd (size, m_builder.getInt64 (1 )), listPtr.sizePtr );
528528 m_builder.CreateBr (nextBlock);
529529
530530 // Otherwise call appendEmpty()
531531 m_builder.SetInsertPoint (elseBlock);
532532 itemPtr = m_builder.CreateCall (resolve_list_append_empty (), listPtr.ptr );
533- createInitialValueStore (arg.second , itemPtr, type);
533+ createReusedValueStore (arg.second , itemPtr, type);
534534 m_builder.CreateStore (m_builder.getInt1 (true ), listPtr.dataPtrDirty );
535535 m_builder.CreateBr (nextBlock);
536536
@@ -555,8 +555,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
555555 // Insert
556556 llvm::Value *index = m_builder.CreateFPToUI (castValue (indexArg.second , indexArg.first ), m_builder.getInt64Ty ());
557557 llvm::Value *itemPtr = m_builder.CreateCall (resolve_list_insert_empty (), { listPtr.ptr , index });
558- createInitialValueStore (valueArg.second , itemPtr, type);
559558 // TODO: Implement list type prediction
559+ createReusedValueStore (valueArg.second , itemPtr, type);
560560 break ;
561561 }
562562
@@ -1727,25 +1727,20 @@ void LLVMCodeBuilder::createValueStore(LLVMRegisterPtr reg, llvm::Value *targetP
17271727 }
17281728}
17291729
1730- void LLVMCodeBuilder::createInitialValueStore (LLVMRegisterPtr reg, llvm::Value *targetPtr, Compiler::StaticType sourceType)
1730+ void LLVMCodeBuilder::createReusedValueStore (LLVMRegisterPtr reg, llvm::Value *targetPtr, Compiler::StaticType sourceType)
17311731{
17321732 llvm::Value *converted = nullptr ;
17331733
17341734 if (sourceType != Compiler::StaticType::Unknown)
17351735 converted = castValue (reg, sourceType);
17361736
1737- auto it = std::find_if (TYPE_MAP.begin (), TYPE_MAP.end (), [sourceType](const std::pair<ValueType, Compiler::StaticType> &pair) { return pair.second == sourceType; });
1738- const ValueType mappedType = it == TYPE_MAP.cend () ? ValueType::Number : it->first ; // unknown type can be ignored
1739-
1740- llvm::Value *valuePtr = m_builder.CreateStructGEP (m_valueDataType, targetPtr, 0 );
1741- llvm::Value *typePtr = m_builder.CreateStructGEP (m_valueDataType, targetPtr, 1 );
1742- m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(mappedType)), typePtr);
1743-
17441737 switch (sourceType) {
17451738 case Compiler::StaticType::Number:
1739+ m_builder.CreateCall (resolve_value_assign_double (), { targetPtr, converted });
1740+ break ;
1741+
17461742 case Compiler::StaticType::Bool:
1747- // Write number/bool directly
1748- m_builder.CreateStore (converted, valuePtr);
1743+ m_builder.CreateCall (resolve_value_assign_bool (), { targetPtr, converted });
17491744 break ;
17501745
17511746 case Compiler::StaticType::String:
0 commit comments