21 namespace spatial_type {
28 :
Codegen(geo_operator, catalog) {
32 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& geo_ti = operand->get_type_info();
45 CHECK(geo_ti.is_geometry());
46 auto& builder = cgen_state->ir_builder_;
48 llvm::Value* array_buff_ptr{
nullptr};
50 if (arg_lvs.size() == 1) {
51 if (dynamic_cast<const Analyzer::GeoExpr*>(operand)) {
53 llvm::dyn_cast<llvm::PointerType>(arg_lvs.front()->getType());
55 const auto is_null_lv =
56 builder.CreateICmp(llvm::CmpInst::ICMP_EQ,
58 llvm::ConstantPointerNull::get(ptr_type));
59 return std::make_tuple(arg_lvs, is_null_lv);
63 arg_lvs.front(), pos_lvs.front(), geo_ti, cgen_state);
64 array_buff_ptr = arr_load_lvs.
buffer;
69 if (dynamic_cast<const Analyzer::GeoOperator*>(operand)) {
72 llvm::CmpInst::ICMP_EQ,
74 llvm::ConstantPointerNull::get(
76 ? llvm::Type::getInt32PtrTy(cgen_state->context_)
77 : llvm::Type::getDoublePtrTy(cgen_state->context_)));
81 array_buff_ptr = arg_lvs.front();
87 return std::make_tuple(std::vector<llvm::Value*>{array_buff_ptr},
is_null);
90 std::vector<llvm::Value*>
codegen(
const std::vector<llvm::Value*>&
args,
95 const auto array_buff_ptr =
args.front();
98 CHECK(geo_ti.is_geometry());
99 auto& builder = cgen_state->ir_builder_;
102 const std::string expr_name = is_x ?
"x" :
"y";
104 llvm::Value* coord_lv;
106 auto compressed_arr_ptr = builder.CreateBitCast(
107 array_buff_ptr, llvm::Type::getInt32PtrTy(cgen_state->context_));
108 auto coord_index = is_x ? cgen_state->llInt(0) : cgen_state->llInt(1);
109 auto coord_lv_ptr = builder.CreateGEP(
110 compressed_arr_ptr->getType()->getScalarType()->getPointerElementType(),
113 expr_name +
"_coord_ptr");
114 auto compressed_coord_lv =
115 builder.CreateLoad(coord_lv_ptr->getType()->getPointerElementType(),
117 expr_name +
"_coord_compressed");
120 cgen_state->emitExternalCall(
"decompress_" + expr_name +
"_coord_geoint",
121 llvm::Type::getDoubleTy(cgen_state->context_),
122 {compressed_coord_lv});
124 auto coord_arr_ptr = builder.CreateBitCast(
125 array_buff_ptr, llvm::Type::getDoublePtrTy(cgen_state->context_));
126 auto coord_index = is_x ? cgen_state->llInt(0) : cgen_state->llInt(1);
127 auto coord_lv_ptr = builder.CreateGEP(
128 coord_arr_ptr->getType()->getScalarType()->getPointerElementType(),
131 expr_name +
"_coord_ptr");
132 coord_lv = builder.CreateLoad(coord_lv_ptr->getType()->getPointerElementType(),
134 expr_name +
"_coord");
139 CHECK(nullcheck_codegen);
144 CHECK(cgen_state->geo_target_cache_.insert(std::make_pair(key, ret)).second);
class for a per-database catalog. also includes metadata for the current database and the current use...
size_t size() const final
CONSTEXPR DEVICE bool is_null(const T &value)
const std::string & getName() 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
SQLTypeInfo getNullType() const final
const SQLTypeInfo & get_type_info() const
static ArrayLoadCodegen codegenGeoArrayLoadAndNullcheck(llvm::Value *byte_stream, llvm::Value *pos, const SQLTypeInfo &ti, CgenState *cgen_state)
const Analyzer::GeoOperator * operator_
std::vector< llvm::Value * > codegen(const std::vector< llvm::Value * > &args, CodeGenerator::NullCheckCodegen *nullcheck_codegen, CgenState *cgen_state, const CompilationOptions &co) final
virtual const Analyzer::Expr * getOperand(const size_t index)
PointAccessors(const Analyzer::GeoOperator *geo_operator, const Catalog_Namespace::Catalog *catalog)
std::string toString() const override