Skip to content

Commit 6a43490

Browse files
committed
LLVMBuildUtils: Convert string to double at compile time if possible
1 parent 0550db2 commit 6a43490

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

src/engine/internal/llvm/llvmbuildutils.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
16101624
llvm::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);

src/engine/internal/llvm/llvmbuildutils.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,11 @@ class LLVMBuildUtils
129129
llvm::Value *castRawValue(LLVMRegister *reg, Compiler::StaticType targetType, NumberType targetNumType);
130130
llvm::Constant *castConstValue(const Value &value, Compiler::StaticType targetType, NumberType targetNumType);
131131

132+
std::pair<llvm::Value *, llvm::Value *> callStringToDoubleWithCheck(LLVMRegister *reg, llvm::Value *stringPtr);
133+
132134
llvm::Value *valueIsValidNumber(LLVMRegister *reg);
133135
llvm::Value *rawValueIsValidNumber(LLVMRegister *reg);
134-
llvm::Value *stringIsValidNumber(llvm::Value *stringPtr);
136+
llvm::Value *stringIsValidNumber(LLVMRegister *reg, llvm::Value *stringPtr);
135137

136138
void createValueCopy(llvm::Value *source, llvm::Value *target);
137139
void copyStructField(llvm::Value *source, llvm::Value *target, int index, llvm::StructType *structType, llvm::Type *fieldType);

0 commit comments

Comments
 (0)