@@ -1607,6 +1607,20 @@ llvm::Constant *LLVMBuildUtils::castConstValue(const Value &value, Compiler::Sta
16071607 }
16081608}
16091609
1610+ std::pair<llvm::Value *, llvm::Value *> LLVMBuildUtils::callStringToDoubleWithCheck (LLVMRegister *reg, llvm::Value *stringPtr)
1611+ {
1612+ if (reg->isConst ()) {
1613+ bool ok;
1614+ double ret = value_stringToDoubleWithCheck (reg->constValue ().data ().stringValue , &ok);
1615+ return { llvm::ConstantFP::get (m_builder.getDoubleTy (), ret), m_builder.getInt1 (ok) };
1616+ } else {
1617+ llvm::Value *okPtr = addAlloca (m_builder.getInt1Ty ());
1618+ llvm::Value *ret = m_builder.CreateCall (m_functions.resolve_value_stringToDoubleWithCheck (), { stringPtr, okPtr });
1619+ llvm::Value *ok = m_builder.CreateLoad (m_builder.getInt1Ty (), okPtr);
1620+ return { ret, ok };
1621+ }
1622+ }
1623+
16101624llvm::Value *LLVMBuildUtils::valueIsValidNumber (LLVMRegister *reg)
16111625{
16121626 if (reg->isConst ())
@@ -1662,7 +1676,7 @@ llvm::Value *LLVMBuildUtils::valueIsValidNumber(LLVMRegister *reg)
16621676 llvm::Value *ptr = m_builder.CreateStructGEP (m_valueDataType, reg->value , 0 );
16631677 llvm::Value *stringPtr = m_builder.CreateLoad (m_stringPtrType->getPointerTo (), ptr);
16641678
1665- llvm::Value *stringResult = stringIsValidNumber (stringPtr);
1679+ llvm::Value *stringResult = stringIsValidNumber (reg, stringPtr);
16661680
16671681 m_builder.CreateBr (mergeBlock);
16681682 results.push_back ({ m_builder.GetInsertBlock (), stringResult });
@@ -1695,15 +1709,15 @@ llvm::Value *LLVMBuildUtils::rawValueIsValidNumber(LLVMRegister *reg)
16951709 return m_builder.getInt1 (true );
16961710
16971711 case Compiler::StaticType::String:
1698- return stringIsValidNumber (reg->value );
1712+ return stringIsValidNumber (reg, reg ->value );
16991713
17001714 default :
17011715 assert (false );
17021716 return nullptr ;
17031717 }
17041718}
17051719
1706- llvm::Value *LLVMBuildUtils::stringIsValidNumber (llvm::Value *stringPtr)
1720+ llvm::Value *LLVMBuildUtils::stringIsValidNumber (LLVMRegister *reg, llvm::Value *stringPtr)
17071721{
17081722 llvm::Value *stringSizePtr = m_builder.CreateStructGEP (m_stringPtrType, stringPtr, 1 );
17091723 llvm::Value *stringSize = m_builder.CreateLoad (m_builder.getInt64Ty (), stringSizePtr);
@@ -1719,10 +1733,8 @@ llvm::Value *LLVMBuildUtils::stringIsValidNumber(llvm::Value *stringPtr)
17191733 m_builder.CreateBr (nextBlock);
17201734
17211735 m_builder.SetInsertPoint (castBlock);
1722- llvm::Value *okPtr = addAlloca (m_builder.getInt1Ty ());
1723- m_builder.CreateCall (m_functions.resolve_value_stringToDoubleWithCheck (), { stringPtr, okPtr });
1724-
1725- llvm::Value *ok = m_builder.CreateLoad (m_builder.getInt1Ty (), okPtr);
1736+ auto ret = callStringToDoubleWithCheck (reg, stringPtr);
1737+ llvm::Value *ok = ret.second ;
17261738 m_builder.CreateBr (nextBlock);
17271739
17281740 m_builder.SetInsertPoint (nextBlock);
@@ -1909,9 +1921,9 @@ llvm::Value *LLVMBuildUtils::createNumberAndStringComparison(LLVMRegister *arg1,
19091921 m_builder.CreateBr (nextBlock);
19101922
19111923 m_builder.SetInsertPoint (stringCastBlock);
1912- llvm::Value *okPtr = addAlloca (m_builder. getInt1Ty () );
1913- llvm::Value *doubleValue = m_builder. CreateCall (m_functions. resolve_value_stringToDoubleWithCheck (), { value2, okPtr }) ;
1914- llvm::Value *ok = m_builder. CreateLoad (m_builder. getInt1Ty (), okPtr) ;
1924+ auto ret = callStringToDoubleWithCheck (arg2, value2 );
1925+ llvm::Value *doubleValue = ret. first ;
1926+ llvm::Value *ok = ret. second ;
19151927 m_builder.CreateBr (nextBlock);
19161928
19171929 m_builder.SetInsertPoint (nextBlock);
@@ -2001,9 +2013,9 @@ llvm::Value *LLVMBuildUtils::createBoolAndStringComparison(LLVMRegister *arg1, L
20012013 // NOTE: Bools are always valid numbers
20022014
20032015 // Convert the string to double
2004- llvm::Value *okPtr = addAlloca (m_builder. getInt1Ty () );
2005- llvm::Value *doubleValue2 = m_builder. CreateCall (m_functions. resolve_value_stringToDoubleWithCheck (), { value2, okPtr }) ;
2006- llvm::Value *ok = m_builder. CreateLoad (m_builder. getInt1Ty (), okPtr) ;
2016+ auto ret = callStringToDoubleWithCheck (arg2, value2 );
2017+ llvm::Value *doubleValue2 = ret. first ;
2018+ llvm::Value *ok = ret. second ;
20072019
20082020 // If the string is a valid number, compare the arguments as numbers, otherwise as strings
20092021 llvm::BasicBlock *numberBlock = llvm::BasicBlock::Create (m_llvmCtx, " " , m_function);
0 commit comments