@@ -2926,37 +2926,11 @@ llvm::Value *LLVMCodeBuilder::createNewValue(LLVMRegister *reg)
29262926{
29272927 // Same as createValue(), but creates a copy of the contents
29282928 // NOTE: It is the caller's responsibility to free the value.
2929- if (reg->isConst ())
2930- return createValue (reg);
2931- else if (reg->isRawValue ) {
2932- if (reg->type () == Compiler::StaticType::String) {
2933- llvm::Value *value = castRawValue (reg, reg->type ());
2934- llvm::Value *ret = addAlloca (m_valueDataType);
2935-
2936- // Allocate string
2937- llvm::Value *result = m_builder.CreateCall (resolve_string_pool_new (), m_builder.getInt1 (false )); // false: do not free after thread is dead
2938- // NOTE: Do not free later
2939-
2940- // Copy string
2941- m_builder.CreateCall (resolve_string_assign (), { result, value });
2942-
2943- // Store string pointer
2944- llvm::Value *valueField = m_builder.CreateStructGEP (m_valueDataType, ret, 0 );
2945- m_builder.CreateStore (value, valueField);
2946-
2947- // Store type
2948- llvm::Value *typeField = m_builder.CreateStructGEP (m_valueDataType, ret, 1 );
2949- m_builder.CreateStore (m_builder.getInt32 (static_cast <uint32_t >(ValueType::String)), typeField);
2950-
2951- return ret;
2952- } else
2953- return createValue (reg);
2954- } else {
2955- llvm::Value *ret = addAlloca (m_valueDataType);
2956- m_builder.CreateCall (resolve_value_init (), { ret });
2957- m_builder.CreateCall (resolve_value_assign_copy (), { ret, reg->value });
2958- return ret;
2959- }
2929+ llvm::Value *value = createValue (reg);
2930+ llvm::Value *ret = addAlloca (m_valueDataType);
2931+ m_builder.CreateCall (resolve_value_init (), { ret });
2932+ m_builder.CreateCall (resolve_value_assign_copy (), { ret, value });
2933+ return ret;
29602934}
29612935
29622936llvm::Value *LLVMCodeBuilder::createComparison (LLVMRegister *arg1, LLVMRegister *arg2, Comparison type)
@@ -3157,10 +3131,8 @@ llvm::Value *LLVMCodeBuilder::createStringComparison(LLVMRegister *arg1, LLVMReg
31573131 if (caseSensitive)
31583132 result = arg1->constValue ().toString () == arg2->constValue ().toString ();
31593133 else {
3160- // TODO: Use a custom comparison function
3161- std::string str1 = arg1->constValue ().toString ();
3162- std::string str2 = arg2->constValue ().toString ();
3163- result = strcasecmp (str1.c_str (), str2.c_str ()) == 0 ;
3134+ StringPtr *str1 = value_toStringPtr (&arg1->constValue ().data ());
3135+ StringPtr *str2 = value_toStringPtr (&arg2->constValue ().data ());
31643136 result = string_compare_case_insensitive (str1, str2) == 0 ;
31653137 }
31663138
0 commit comments