32 CHECK(idx_ti.is_integer());
33 auto idx_lvs =
codegen(idx_expr,
true, co);
35 auto idx_lv = idx_lvs.front();
36 if (idx_ti.get_logical_size() < 8) {
41 const auto& array_ti = arr_expr->get_type_info();
42 CHECK(array_ti.is_array());
43 const auto& elem_ti = array_ti.get_elem_type();
44 const std::string array_at_fname{
46 ?
"array_at_" + std::string(elem_ti.get_type() ==
kDOUBLE ?
"double_checked"
48 :
"array_at_int" +
std::to_string(elem_ti.get_logical_size() * 8) +
52 ? (elem_ti.get_type() ==
kDOUBLE
56 const auto arr_lvs =
codegen(arr_expr,
true, co);
71 const auto arr_expr = expr->
get_arg();
73 CHECK(array_ti.is_array());
74 const auto& elem_ti = array_ti.get_elem_type();
75 auto arr_lv =
codegen(arr_expr,
true, co);
76 std::string fn_name(
"array_size");
78 std::vector<llvm::Value*> array_size_args{
82 const bool is_nullable{!arr_expr->get_type_info().get_notnull()};
84 fn_name +=
"_nullable";
95 using ValueVector = std::vector<llvm::Value*>;
96 ValueVector argument_list;
100 auto coord_compression = (return_type.get_compression() ==
kENCODING_GEOINT);
101 if (coord_compression) {
106 const auto arg_lvs =
codegen(arg,
true, co);
107 if (arg_lvs.size() == 1) {
108 if (coord_compression) {
111 auto c = ir_builder.CreateCast(llvm::Instruction::CastOps::FPToSI,
112 ir_builder.CreateFMul(arg_lvs.front(), mult),
114 argument_list.push_back(c);
116 argument_list.push_back(arg_lvs.front());
119 throw std::runtime_error(
120 "Unexpected argument count during array[] code generation.");
124 auto array_element_size_bytes =
125 return_type.get_elem_type().get_array_context_logical_size();
126 auto* array_index_type =
131 if (array_expr->
isNull()) {
132 return {llvm::ConstantPointerNull::get(
139 llvm::Value* dead_pointer = llvm::ConstantExpr::getIntToPtr(
144 llvm::Value* allocated_target_buffer;
146 allocated_target_buffer = ir_builder.CreateAlloca(array_type);
152 allocated_target_buffer =
158 "register_buffer_with_executor_rsm",
161 allocated_target_buffer});
163 llvm::Value* casted_allocated_target_buffer =
164 ir_builder.CreatePointerCast(allocated_target_buffer, array_type->getPointerTo());
166 for (
size_t i = 0; i < array_expr->getElementCount(); i++) {
167 auto* element = argument_list[i];
168 auto* element_ptr = ir_builder.CreateGEP(
170 casted_allocated_target_buffer,
173 const auto& elem_ti = return_type.get_elem_type();
174 if (elem_ti.is_boolean()) {
175 const auto byte_casted_bit =
176 ir_builder.CreateIntCast(element, array_index_type,
true);
177 ir_builder.CreateStore(byte_casted_bit, element_ptr);
178 }
else if (elem_ti.is_fp()) {
179 switch (elem_ti.get_size()) {
180 case sizeof(double): {
181 const auto double_element_ptr = ir_builder.CreatePointerCast(
183 ir_builder.CreateStore(element, double_element_ptr);
186 case sizeof(float): {
187 const auto float_element_ptr = ir_builder.CreatePointerCast(
189 ir_builder.CreateStore(element, float_element_ptr);
195 }
else if (elem_ti.is_integer() || elem_ti.is_decimal() || elem_ti.is_date() ||
196 elem_ti.is_timestamp() || elem_ti.is_time() || elem_ti.is_timeinterval() ||
197 elem_ti.is_dict_encoded_string()) {
199 const auto sign_extended_element = ir_builder.CreateSExt(element, array_index_type);
200 ir_builder.CreateStore(sign_extended_element, element_ptr);
202 throw std::runtime_error(
"Unsupported type used in ARRAY construction.");
206 return {ir_builder.CreateGEP(
const Expr * get_right_operand() const
llvm::IRBuilder ir_builder_
llvm::Value * posArg(const Analyzer::Expr *) const
llvm::Value * codegenArrayAt(const Analyzer::BinOper *, const CompilationOptions &)
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
llvm::LLVMContext & context_
llvm::Value * emitExternalCall(const std::string &fname, llvm::Type *ret_type, const std::vector< llvm::Value * > args, const std::vector< llvm::Attribute::AttrKind > &fnattrs={}, const bool has_struct_return=false)
llvm::ConstantInt * inlineIntNull(const SQLTypeInfo &)
llvm::ConstantFP * llFp(const float v) const
std::vector< llvm::Value * > codegenArrayExpr(const Analyzer::ArrayExpr *, const CompilationOptions &)
const SQLTypeInfo & get_type_info() const
size_t getElementCount() const
ExecutorDeviceType device_type
std::vector< llvm::Value * > codegen(const Analyzer::Expr *, const bool fetch_columns, const CompilationOptions &)
bool isLocalAlloc() const
const Expr * get_operand() const
llvm::ConstantInt * llInt(const T v) const
llvm::Value * codegenUnnest(const Analyzer::UOper *, const CompilationOptions &)
const Expr * get_left_operand() const
uint32_t log2_bytes(const uint32_t bytes)
llvm::ArrayType * get_int_array_type(int const width, int count, llvm::LLVMContext &context)
const Expr * get_arg() const
const Analyzer::Expr * getElement(const size_t i) const
llvm::ConstantFP * inlineFpNull(const SQLTypeInfo &)
Executor * executor() const