21 namespace spatial_type {
27 :
Codegen(geo_operator, catalog) {
39 Executor* executor)
final {
42 return std::make_unique<CodeGenerator::NullCheckCodegen>(
49 size_t size() const final {
return 2; }
58 const std::vector<llvm::Value*>& arg_lvs,
59 const std::vector<llvm::Value*>& pos_lvs,
62 CHECK_EQ(pos_lvs.front(), pos_lvs.back());
65 const auto& geo_ti = operand->get_type_info();
68 auto& builder = cgen_state->ir_builder_;
70 std::vector<llvm::Value*> array_operand_lvs;
71 CHECK(!arg_lvs.empty());
72 auto index_lv = builder.CreateMul(
73 builder.CreateSub(arg_lvs.back(), cgen_state->llInt(static_cast<int32_t>(1))),
74 cgen_state->llInt(static_cast<int32_t>(2)));
75 llvm::Value* is_null_lv{
nullptr};
76 if (arg_lvs.size() == 2) {
78 array_operand_lvs.push_back(
79 cgen_state->emitExternalCall(
"array_buff",
80 llvm::Type::getInt8PtrTy(cgen_state->context_),
81 {arg_lvs.front(), pos_lvs.front()}));
82 const bool is_nullable = !geo_ti.get_notnull();
83 std::string size_fn_name =
"array_size";
85 size_fn_name +=
"_nullable";
89 std::vector<llvm::Value*> array_sz_args{
90 arg_lvs.front(), pos_lvs.front(), cgen_state->llInt(
log2_bytes(elem_sz))};
92 array_sz_args.push_back(
93 cgen_state->llInt(static_cast<int32_t>(inline_int_null_value<int32_t>())));
95 array_operand_lvs.push_back(cgen_state->emitExternalCall(
96 size_fn_name,
get_int_type(32, cgen_state->context_), array_sz_args));
98 auto geo_size_lv = array_operand_lvs.back();
100 const auto outside_linestring_bounds_lv = builder.CreateNot(builder.CreateICmp(
101 llvm::ICmpInst::ICMP_SLT,
102 builder.CreateMul(index_lv, cgen_state->llInt(static_cast<int32_t>(8))),
104 outside_linestring_bounds_lv->setName(
"outside_linestring_bounds");
105 const auto input_is_null_lv = builder.CreateICmp(
106 llvm::ICmpInst::ICMP_EQ,
108 cgen_state->llInt(static_cast<int32_t>(inline_int_null_value<int32_t>())));
109 input_is_null_lv->setName(
"input_is_null");
110 is_null_lv = builder.CreateOr(outside_linestring_bounds_lv, input_is_null_lv);
112 CHECK_EQ(arg_lvs.size(), size_t(3));
113 array_operand_lvs.push_back(arg_lvs[0]);
114 array_operand_lvs.push_back(arg_lvs[1]);
116 const auto geo_size_lv = arg_lvs[1];
119 is_null_lv = builder.CreateNot(
120 builder.CreateICmp(llvm::ICmpInst::ICMP_SLT, index_lv, geo_size_lv));
122 array_operand_lvs.push_back(index_lv);
123 return std::make_tuple(array_operand_lvs, is_null_lv);
126 std::vector<llvm::Value*>
codegen(
const std::vector<llvm::Value*>&
args,
131 const auto& geo_ti = getOperand(0)->get_type_info();
132 CHECK(geo_ti.is_geometry());
134 llvm::Value* array_buff_cast{
nullptr};
136 auto& builder = cgen_state->ir_builder_;
138 array_buff_cast = builder.CreateBitCast(
139 args.front(), llvm::Type::getInt32PtrTy(cgen_state->context_));
141 array_buff_cast = builder.CreateBitCast(
142 args.front(), llvm::Type::getDoublePtrTy(cgen_state->context_));
145 const auto index_lv =
args.back();
146 auto array_offset_lv = builder.CreateGEP(
147 array_buff_cast->getType()->getScalarType()->getPointerElementType(),
150 operator_->getName() +
"_Offset");
151 CHECK(nullcheck_codegen);
152 auto ret_lv = nullcheck_codegen->finalize(
153 llvm::ConstantPointerNull::get(
155 ? llvm::PointerType::get(llvm::Type::getInt32Ty(cgen_state->context_), 0)
156 : llvm::PointerType::get(llvm::Type::getDoubleTy(cgen_state->context_),
159 const auto geo_size_lv =
args[1];
160 return {ret_lv, geo_size_lv};
class for a per-database catalog. also includes metadata for the current database and the current use...
std::unique_ptr< CodeGenerator::NullCheckCodegen > getNullCheckCodegen(llvm::Value *null_lv, CgenState *cgen_state, Executor *executor) final
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
SQLTypeInfo getNullType() const final
std::vector< llvm::Value * > codegen(const std::vector< llvm::Value * > &args, CodeGenerator::NullCheckCodegen *nullcheck_codegen, CgenState *cgen_state, const CompilationOptions &co) final
PointN(const Analyzer::GeoOperator *geo_operator, const Catalog_Namespace::Catalog *catalog)
const Analyzer::GeoOperator * operator_
size_t size() const final
virtual const Analyzer::Expr * getOperand(const size_t index)
std::string getName() const
uint32_t log2_bytes(const uint32_t bytes)
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