21 namespace spatial_type {
27 :
Codegen(geo_operator, catalog) {
33 size_t size() const final {
return 1; }
38 const std::vector<llvm::Value*>& arg_lvs,
39 const std::vector<llvm::Value*>& pos_lvs,
44 const auto& operand_ti = operand->get_type_info();
46 std::string size_fn_name =
"array_size";
48 size_fn_name +=
"_nullable";
51 const uint32_t coords_elem_sz_bytes =
53 auto& builder = cgen_state->ir_builder_;
55 std::vector<llvm::Value*> operand_lvs;
57 if (dynamic_cast<const Analyzer::ColumnVar*>(operand)) {
58 for (
size_t i = 0; i < arg_lvs.size(); i++) {
61 cgen_state->emitExternalCall(
"array_buff",
62 llvm::Type::getInt8PtrTy(cgen_state->context_),
63 {lv, pos_lvs.front()});
65 array_buff_lv = builder.CreateBitCast(
66 array_buff_lv, llvm::Type::getInt32PtrTy(cgen_state->context_));
68 operand_lvs.push_back(array_buff_lv);
69 const auto ptr_type = llvm::dyn_cast_or_null<llvm::PointerType>(lv->getType());
71 const auto elem_type = ptr_type->getElementType();
73 std::vector<llvm::Value*> array_sz_args{
76 cgen_state->llInt(
log2_bytes(i == 0 ? coords_elem_sz_bytes : 4))};
78 array_sz_args.push_back(
79 cgen_state->llInt(static_cast<int32_t>(inline_int_null_value<int32_t>())));
81 operand_lvs.push_back(cgen_state->emitExternalCall(
82 size_fn_name,
get_int_type(32, cgen_state->context_), array_sz_args));
85 for (
size_t i = 0; i < arg_lvs.size(); i++) {
86 auto arg_lv = arg_lvs[i];
87 if (i > 0 && arg_lv->getType()->isPointerTy()) {
88 arg_lv = builder.CreateBitCast(arg_lv,
89 llvm::Type::getInt32PtrTy(cgen_state->context_));
91 operand_lvs.push_back(arg_lv);
95 size_t(2 * operand_ti.get_physical_coord_cols()));
99 llvm::Value* null_check_operand_lv{
nullptr};
101 null_check_operand_lv = operand_lvs[1];
102 if (null_check_operand_lv->getType() !=
103 llvm::Type::getInt32Ty(cgen_state->context_)) {
104 CHECK(null_check_operand_lv->getType() ==
105 llvm::Type::getInt64Ty(cgen_state->context_));
108 null_check_operand_lv = builder.CreateTrunc(
109 null_check_operand_lv, llvm::Type::getInt32Ty(cgen_state->context_));
113 return std::make_tuple(operand_lvs, null_check_operand_lv);
116 std::vector<llvm::Value*>
codegen(
const std::vector<llvm::Value*>&
args,
120 std::string func_name =
"ST_Centroid";
121 const auto& ret_ti = operator_->get_type_info();
122 CHECK(ret_ti.is_geometry() && ret_ti.get_type() ==
kPOINT);
123 const auto& operand_ti = getOperand(0)->get_type_info();
125 auto& builder = cgen_state->ir_builder_;
128 auto elem_ty = llvm::Type::getDoubleTy(cgen_state->context_);
129 llvm::ArrayType* arr_type = llvm::ArrayType::get(elem_ty, 2);
130 auto pt_local_storage_lv =
131 builder.CreateAlloca(arr_type,
nullptr, func_name +
"_Local_Storage");
133 llvm::Value* pt_compressed_local_storage_lv{NULL};
136 auto elem_ty = llvm::Type::getInt32Ty(cgen_state->context_);
137 llvm::ArrayType* arr_type = llvm::ArrayType::get(elem_ty, 2);
138 pt_compressed_local_storage_lv = builder.CreateAlloca(
139 arr_type,
nullptr, func_name +
"_Compressed_Local_Storage");
144 auto operand_lvs =
args;
147 operand_lvs.push_back(
149 operand_lvs.push_back(cgen_state->llInt(operand_ti.get_input_srid()));
150 auto output_srid = operand_ti.get_output_srid();
151 if (
const auto srid_override = operator_->getOutputSridOverride()) {
152 output_srid = *srid_override;
154 operand_lvs.push_back(cgen_state->llInt(output_srid));
156 auto idx_lv = cgen_state->llInt(0);
157 auto pt_local_storage_gep = llvm::GetElementPtrInst::CreateInBounds(
158 pt_local_storage_lv->getType()->getScalarType()->getPointerElementType(),
162 builder.GetInsertBlock());
164 operand_lvs.push_back(pt_local_storage_gep);
166 cgen_state->emitExternalCall(
167 func_name, llvm::Type::getVoidTy(cgen_state->context_), operand_lvs);
169 llvm::Value* ret_coords = pt_local_storage_lv;
174 auto x_ptr = builder.CreateGEP(
175 pt_local_storage_lv->getType()->getScalarType()->getPointerElementType(),
177 {cgen_state->llInt(0), cgen_state->llInt(0)},
179 auto x_lv = builder.CreateLoad(x_ptr->getType()->getPointerElementType(), x_ptr);
180 auto compressed_x_lv =
181 cgen_state->emitExternalCall(
"compress_x_coord_geoint",
182 llvm::Type::getInt32Ty(cgen_state->context_),
184 auto compressed_x_ptr =
185 builder.CreateGEP(pt_compressed_local_storage_lv->getType()
187 ->getPointerElementType(),
188 pt_compressed_local_storage_lv,
189 {cgen_state->llInt(0), cgen_state->llInt(0)},
191 builder.CreateStore(compressed_x_lv, compressed_x_ptr);
193 auto y_ptr = builder.CreateGEP(
194 pt_local_storage_lv->getType()->getScalarType()->getPointerElementType(),
196 {cgen_state->llInt(0), cgen_state->llInt(1)},
198 auto y_lv = builder.CreateLoad(y_ptr->getType()->getPointerElementType(), y_ptr);
199 auto compressed_y_lv =
200 cgen_state->emitExternalCall(
"compress_y_coord_geoint",
201 llvm::Type::getInt32Ty(cgen_state->context_),
203 auto compressed_y_ptr =
204 builder.CreateGEP(pt_compressed_local_storage_lv->getType()
206 ->getPointerElementType(),
207 pt_compressed_local_storage_lv,
208 {cgen_state->llInt(0), cgen_state->llInt(1)},
210 builder.CreateStore(compressed_y_lv, compressed_y_ptr);
212 ret_coords = pt_compressed_local_storage_lv;
218 ? llvm::Type::getInt32PtrTy(cgen_state->context_)
219 : llvm::
Type::getDoublePtrTy(cgen_state->context_);
220 ret_coords = builder.CreateBitCast(ret_coords, ret_ty);
223 CHECK(nullcheck_codegen);
224 ret_coords = nullcheck_codegen->finalize(
225 llvm::ConstantPointerNull::get(
227 ? llvm::PointerType::get(llvm::Type::getInt32Ty(cgen_state->context_),
229 : llvm::PointerType::get(llvm::
Type::getDoubleTy(cgen_state->context_),
class for a per-database catalog. also includes metadata for the current database and the current use...
int32_t get_compression_scheme(const SQLTypeInfo &ti)
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
std::vector< llvm::Value * > codegen(const std::vector< llvm::Value * > &args, CodeGenerator::NullCheckCodegen *nullcheck_codegen, CgenState *cgen_state, const CompilationOptions &co) final
std::string suffix(SQLTypes type)
const SQLTypeInfo & get_type_info() const
std::tuple< std::vector< llvm::Value * >, llvm::Value * > codegenLoads(const std::vector< llvm::Value * > &arg_lvs, const std::vector< llvm::Value * > &pos_lvs, CgenState *cgen_state) final
const Analyzer::GeoOperator * operator_
size_t size() const final
Centroid(const Analyzer::GeoOperator *geo_operator, const Catalog_Namespace::Catalog *catalog)
virtual const Analyzer::Expr * getOperand(const size_t index)
uint32_t log2_bytes(const uint32_t bytes)
SQLTypeInfo getNullType() const final