@@ -96,8 +96,11 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
9696 m_scopeVariables.push_back ({});
9797
9898 // Create list pointers
99- for (auto &[list, listPtr] : m_listPtrs)
99+ for (auto &[list, listPtr] : m_listPtrs) {
100100 listPtr.ptr = getListPtr (targetLists, list);
101+ listPtr.dataPtr = m_builder.CreateAlloca (m_valueDataType->getPointerTo ());
102+ m_builder.CreateStore (m_builder.CreateCall (resolve_list_data (), listPtr.ptr ), listPtr.dataPtr );
103+ }
101104
102105 // Execute recorded steps
103106 for (const LLVMInstruction &step : m_instructions) {
@@ -500,6 +503,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
500503 const LLVMListPtr &listPtr = m_listPtrs[step.workList ];
501504 llvm::Value *itemPtr = m_builder.CreateCall (resolve_list_append_empty (), listPtr.ptr );
502505 createInitialValueStore (arg.second , itemPtr, type);
506+ m_builder.CreateStore (m_builder.CreateCall (resolve_list_data (), listPtr.ptr ), listPtr.dataPtr );
503507 // TODO: Implement list type prediction
504508 break ;
505509 }
@@ -513,6 +517,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
513517 llvm::Value *index = m_builder.CreateFPToUI (castValue (indexArg.second , indexArg.first ), m_builder.getInt64Ty ());
514518 llvm::Value *itemPtr = m_builder.CreateCall (resolve_list_insert_empty (), { listPtr.ptr , index });
515519 createInitialValueStore (valueArg.second , itemPtr, type);
520+ m_builder.CreateStore (m_builder.CreateCall (resolve_list_data (), listPtr.ptr ), listPtr.dataPtr );
516521 // TODO: Implement list type prediction
517522 break ;
518523 }
@@ -524,7 +529,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
524529 Compiler::StaticType type = optimizeRegisterType (valueArg.second );
525530 const LLVMListPtr &listPtr = m_listPtrs[step.workList ];
526531 llvm::Value *index = m_builder.CreateFPToUI (castValue (indexArg.second , indexArg.first ), m_builder.getInt64Ty ());
527- llvm::Value *itemPtr = m_builder.CreateCall ( resolve_list_get_item (), { listPtr.ptr , index } );
532+ llvm::Value *itemPtr = getListItem ( m_builder.CreateLoad (m_valueDataType-> getPointerTo (), listPtr.dataPtr ) , index);
528533 createValueStore (valueArg.second , itemPtr, type, listPtr.type );
529534 // TODO: Implement list type prediction
530535 break ;
@@ -535,7 +540,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
535540 const auto &arg = step.args [0 ];
536541 const LLVMListPtr &listPtr = m_listPtrs[step.workList ];
537542 llvm::Value *index = m_builder.CreateFPToUI (castValue (arg.second , arg.first ), m_builder.getInt64Ty ());
538- step.functionReturnReg ->value = m_builder.CreateCall ( resolve_list_get_item (), { listPtr.ptr , index } );
543+ step.functionReturnReg ->value = getListItem ( m_builder.CreateLoad (m_valueDataType-> getPointerTo (), listPtr.dataPtr ) , index);
539544 step.functionReturnReg ->type = listPtr.type ;
540545 break ;
541546 }
@@ -551,6 +556,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
551556 if (!m_warp) {
552557 freeHeap ();
553558 syncVariables (targetVariables);
559+ reloadLists ();
554560 coro->createSuspend ();
555561 reloadVariables (targetVariables);
556562 }
@@ -1521,6 +1527,13 @@ void LLVMCodeBuilder::reloadVariables(llvm::Value *targetVariables)
15211527 }
15221528}
15231529
1530+ void LLVMCodeBuilder::reloadLists ()
1531+ {
1532+ // Reload list data pointers
1533+ for (auto &[list, listPtr] : m_listPtrs)
1534+ m_builder.CreateStore (m_builder.CreateCall (resolve_list_data (), listPtr.ptr ), listPtr.dataPtr );
1535+ }
1536+
15241537LLVMInstruction &LLVMCodeBuilder::createOp (LLVMInstruction::Type type, Compiler::StaticType retType, Compiler::StaticType argType, size_t argCount)
15251538{
15261539 std::vector<Compiler::StaticType> types;
@@ -1684,6 +1697,11 @@ void LLVMCodeBuilder::copyStructField(llvm::Value *source, llvm::Value *target,
16841697 m_builder.CreateStore (m_builder.CreateLoad (fieldType, sourceField), targetField);
16851698}
16861699
1700+ llvm::Value *LLVMCodeBuilder::getListItem (llvm::Value *dataPtr, llvm::Value *index)
1701+ {
1702+ return m_builder.CreateGEP (m_valueDataType, dataPtr, index);
1703+ }
1704+
16871705llvm::Value *LLVMCodeBuilder::createValue (LLVMRegisterPtr reg)
16881706{
16891707 if (reg->isConstValue ) {
@@ -2026,10 +2044,10 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_insert_empty()
20262044 return resolveFunction (" list_insert_empty" , llvm::FunctionType::get (m_valueDataType->getPointerTo (), { listPtr, m_builder.getInt64Ty () }, false ));
20272045}
20282046
2029- llvm::FunctionCallee LLVMCodeBuilder::resolve_list_get_item ()
2047+ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_data ()
20302048{
20312049 llvm::Type *listPtr = llvm::PointerType::get (llvm::Type::getInt8Ty (m_ctx), 0 );
2032- return resolveFunction (" list_get_item " , llvm::FunctionType::get (m_valueDataType->getPointerTo (), { listPtr, m_builder. getInt64Ty () }, false ));
2050+ return resolveFunction (" list_data " , llvm::FunctionType::get (m_valueDataType->getPointerTo (), { listPtr }, false ));
20332051}
20342052
20352053llvm::FunctionCallee LLVMCodeBuilder::resolve_list_size ()
0 commit comments