@@ -395,16 +395,6 @@ void LLVMBuildUtils::popScopeLevel()
395395 m_stringHeap.pop_back ();
396396}
397397
398- void LLVMBuildUtils::freeStringLater (llvm::Value *value)
399- {
400- assert (!m_stringHeap.empty ());
401-
402- if (m_stringHeap.empty ())
403- return ;
404-
405- m_stringHeap.back ().push_back (value);
406- }
407-
408398void LLVMBuildUtils::freeScopeHeap ()
409399{
410400 if (m_stringHeap.empty ())
@@ -468,6 +458,16 @@ llvm::Value *LLVMBuildUtils::addAlloca(llvm::Type *type)
468458 return ret;
469459}
470460
461+ llvm::Value *LLVMBuildUtils::addStringAlloca ()
462+ {
463+ // NOTE: The string will be deallocated when the thread is destroyed
464+ llvm::BasicBlock *block = m_builder.GetInsertBlock ();
465+ m_builder.SetInsertPointPastAllocas (m_function);
466+ llvm::Value *ret = m_builder.CreateCall (m_functions.resolve_string_pool_new (), { m_builder.getInt1 (true ) }, " localString" );
467+ m_builder.SetInsertPoint (block);
468+ return ret;
469+ }
470+
471471llvm::Value *LLVMBuildUtils::castValue (LLVMRegister *reg, Compiler::StaticType targetType, NumberType targetNumType)
472472{
473473 if (reg->isConst ()) {
@@ -629,7 +629,7 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
629629 llvm::Value *intCast = m_builder.CreateSIToFP (reg->intValue , m_builder.getDoubleTy ());
630630 llvm::Value *value = m_builder.CreateSelect (reg->isInt , intCast, doubleValue);
631631
632- llvm::Value *numberResult = m_builder. CreateCall (m_functions. resolve_string_pool_new (), { m_builder. getInt1 ( true ) } );
632+ llvm::Value *numberResult = addStringAlloca ( );
633633 m_builder.CreateCall (m_functions.resolve_value_doubleToStringPtr (), { value, numberResult });
634634 m_builder.CreateBr (mergeBlock);
635635 results.push_back ({ numberBlock, numberResult });
@@ -640,13 +640,10 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
640640 llvm::BasicBlock *boolBlock = llvm::BasicBlock::Create (m_llvmCtx, " bool" , m_function);
641641 sw->addCase (m_builder.getInt32 (static_cast <uint32_t >(ValueType::Bool)), boolBlock);
642642
643- // Since the value is deallocated later, we need to create a copy
644643 m_builder.SetInsertPoint (boolBlock);
645644 llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
646645 llvm::Value *value = m_builder.CreateLoad (m_builder.getInt1Ty (), ptr);
647- llvm::Value *stringPtr = m_builder.CreateCall (m_functions.resolve_value_boolToStringPtr (), value);
648- llvm::Value *boolResult = m_builder.CreateCall (m_functions.resolve_string_pool_new (), m_builder.getInt1 (true ));
649- m_builder.CreateCall (m_functions.resolve_string_assign (), { boolResult, stringPtr });
646+ llvm::Value *boolResult = m_builder.CreateCall (m_functions.resolve_value_boolToStringPtr (), value);
650647 m_builder.CreateBr (mergeBlock);
651648 results.push_back ({ boolBlock, boolResult });
652649 }
@@ -658,9 +655,7 @@ llvm::Value *LLVMBuildUtils::castValue(LLVMRegister *reg, Compiler::StaticType t
658655
659656 m_builder.SetInsertPoint (stringBlock);
660657 llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
661- llvm::Value *stringPtr = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
662- llvm::Value *stringResult = m_builder.CreateCall (m_functions.resolve_string_pool_new (), m_builder.getInt1 (true ));
663- m_builder.CreateCall (m_functions.resolve_string_assign (), { stringResult, stringPtr });
658+ llvm::Value *stringResult = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
664659 m_builder.CreateBr (mergeBlock);
665660 results.push_back ({ stringBlock, stringResult });
666661 }
@@ -1504,9 +1499,8 @@ llvm::Value *LLVMBuildUtils::castRawValue(LLVMRegister *reg, Compiler::StaticTyp
15041499 // Convert double/int to string
15051500 llvm::Value *intCast = m_builder.CreateSIToFP (reg->intValue , m_builder.getDoubleTy ());
15061501 llvm::Value *doubleValue = m_builder.CreateSelect (reg->isInt , intCast, reg->value );
1507- llvm::Value *ptr = m_builder. CreateCall (m_functions. resolve_string_pool_new (), { m_builder. getInt1 ( true ) } );
1502+ llvm::Value *ptr = addStringAlloca ( );
15081503 m_builder.CreateCall (m_functions.resolve_value_doubleToStringPtr (), { doubleValue, ptr });
1509- freeStringLater (ptr);
15101504 return ptr;
15111505 }
15121506
@@ -1800,10 +1794,9 @@ llvm::Value *LLVMBuildUtils::createNumberAndStringComparison(LLVMRegister *arg1,
18001794
18011795 // String comparison
18021796 m_builder.SetInsertPoint (stringBlock);
1803- llvm::Value *stringValue = m_builder. CreateCall (m_functions. resolve_string_pool_new (), { m_builder. getInt1 ( true ) } );
1797+ llvm::Value *stringValue = addStringAlloca ( );
18041798 m_builder.CreateCall (m_functions.resolve_value_doubleToStringPtr (), { value1, stringValue });
18051799 llvm::Value *cmp = m_builder.CreateCall (m_functions.resolve_string_compare_case_insensitive (), { stringValue, value2 });
1806- m_builder.CreateCall (m_functions.resolve_string_pool_free (), { stringValue }); // free the string immediately
18071800
18081801 llvm::Value *zero = llvm::ConstantInt::get (m_builder.getInt32Ty (), 0 , true );
18091802 llvm::Value *stringCmp;
0 commit comments