@@ -523,14 +523,14 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
523
523
// If there's enough space, use the allocated memory
524
524
m_builder.SetInsertPoint (ifBlock);
525
525
llvm::Value *itemPtr = getListItem (listPtr, size, func);
526
- createInitialValueStore (arg.second , itemPtr, type);
526
+ createReusedValueStore (arg.second , itemPtr, type);
527
527
m_builder.CreateStore (m_builder.CreateAdd (size, m_builder.getInt64 (1 )), listPtr.sizePtr );
528
528
m_builder.CreateBr (nextBlock);
529
529
530
530
// Otherwise call appendEmpty()
531
531
m_builder.SetInsertPoint (elseBlock);
532
532
itemPtr = m_builder.CreateCall (resolve_list_append_empty (), listPtr.ptr );
533
- createInitialValueStore (arg.second , itemPtr, type);
533
+ createReusedValueStore (arg.second , itemPtr, type);
534
534
m_builder.CreateStore (m_builder.getInt1 (true ), listPtr.dataPtrDirty );
535
535
m_builder.CreateBr (nextBlock);
536
536
@@ -555,8 +555,8 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
555
555
// Insert
556
556
llvm::Value *index = m_builder.CreateFPToUI (castValue (indexArg.second , indexArg.first ), m_builder.getInt64Ty ());
557
557
llvm::Value *itemPtr = m_builder.CreateCall (resolve_list_insert_empty (), { listPtr.ptr , index });
558
- createInitialValueStore (valueArg.second , itemPtr, type);
559
558
// TODO: Implement list type prediction
559
+ createReusedValueStore (valueArg.second , itemPtr, type);
560
560
break ;
561
561
}
562
562
@@ -1727,25 +1727,20 @@ void LLVMCodeBuilder::createValueStore(LLVMRegisterPtr reg, llvm::Value *targetP
1727
1727
}
1728
1728
}
1729
1729
1730
- void LLVMCodeBuilder::createInitialValueStore (LLVMRegisterPtr reg, llvm::Value *targetPtr, Compiler::StaticType sourceType)
1730
+ void LLVMCodeBuilder::createReusedValueStore (LLVMRegisterPtr reg, llvm::Value *targetPtr, Compiler::StaticType sourceType)
1731
1731
{
1732
1732
llvm::Value *converted = nullptr ;
1733
1733
1734
1734
if (sourceType != Compiler::StaticType::Unknown)
1735
1735
converted = castValue (reg, sourceType);
1736
1736
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
-
1744
1737
switch (sourceType) {
1745
1738
case Compiler::StaticType::Number:
1739
+ m_builder.CreateCall (resolve_value_assign_double (), { targetPtr, converted });
1740
+ break ;
1741
+
1746
1742
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 });
1749
1744
break ;
1750
1745
1751
1746
case Compiler::StaticType::String:
0 commit comments