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;
102 const auto arg_lvs =
codegen(arg,
true, co);
103 if (arg_lvs.size() == 1) {
104 argument_list.push_back(arg_lvs.front());
106 throw std::runtime_error(
107 "Unexpected argument count during array[] code generation.");
111 auto array_element_size_bytes =
112 return_type.get_elem_type().get_array_context_logical_size();
113 auto* array_index_type =
118 if (array_expr->
isNull()) {
119 return {llvm::ConstantPointerNull::get(
126 llvm::Value* dead_pointer = llvm::ConstantExpr::getIntToPtr(
131 llvm::Value* allocated_target_buffer;
133 allocated_target_buffer = ir_builder.CreateAlloca(array_type);
139 allocated_target_buffer =
142 {cgen_state_->llInt(array_expr->getElementCount()),
143 cgen_state_->llInt(array_element_size_bytes)});
145 "register_buffer_with_executor_rsm",
147 {cgen_state_->llInt(reinterpret_cast<int64_t>(executor())),
148 allocated_target_buffer});
150 llvm::Value* casted_allocated_target_buffer =
151 ir_builder.CreatePointerCast(allocated_target_buffer, array_type->getPointerTo());
154 auto* element = argument_list[i];
155 auto* element_ptr = ir_builder.CreateGEP(
157 casted_allocated_target_buffer,
160 const auto& elem_ti = return_type.get_elem_type();
161 if (elem_ti.is_boolean()) {
162 const auto byte_casted_bit =
163 ir_builder.CreateIntCast(element, array_index_type,
true);
164 ir_builder.CreateStore(byte_casted_bit, element_ptr);
165 }
else if (elem_ti.is_fp()) {
166 switch (elem_ti.get_size()) {
167 case sizeof(double): {
168 const auto double_element_ptr = ir_builder.CreatePointerCast(
170 ir_builder.CreateStore(element, double_element_ptr);
173 case sizeof(float): {
174 const auto float_element_ptr = ir_builder.CreatePointerCast(
176 ir_builder.CreateStore(element, float_element_ptr);
182 }
else if (elem_ti.is_integer() || elem_ti.is_decimal() || elem_ti.is_date() ||
183 elem_ti.is_timestamp() || elem_ti.is_time() || elem_ti.is_timeinterval() ||
184 elem_ti.is_dict_encoded_string()) {
186 const auto sign_extended_element = ir_builder.CreateSExt(element, array_index_type);
187 ir_builder.CreateStore(sign_extended_element, element_ptr);
189 throw std::runtime_error(
"Unsupported type used in ARRAY construction.");
193 return {ir_builder.CreateGEP(
size_t getElementCount() const
llvm::IRBuilder ir_builder_
bool isLocalAlloc() const
llvm::Value * codegenArrayAt(const Analyzer::BinOper *, const CompilationOptions &)
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
const Expr * get_arg() const
const Analyzer::Expr * getElement(const size_t i) const
llvm::LLVMContext & context_
llvm::ConstantInt * inlineIntNull(const SQLTypeInfo &)
std::vector< llvm::Value * > codegenArrayExpr(const Analyzer::ArrayExpr *, const CompilationOptions &)
ExecutorDeviceType device_type
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)
std::vector< llvm::Value * > codegen(const Analyzer::Expr *, const bool fetch_columns, const CompilationOptions &)
const SQLTypeInfo & get_type_info() const
llvm::Value * codegenUnnest(const Analyzer::UOper *, const CompilationOptions &)
llvm::Value * posArg(const Analyzer::Expr *) const
uint32_t log2_bytes(const uint32_t bytes)
llvm::ArrayType * get_int_array_type(int const width, int count, llvm::LLVMContext &context)
llvm::ConstantInt * llInt(const T v) const
const Expr * get_right_operand() const
llvm::ConstantFP * inlineFpNull(const SQLTypeInfo &)
const Expr * get_left_operand() const
const Expr * get_operand() const