25 #include "../Analyzer/Analyzer.h"
26 #include "../Shared/InsertionOrderedMap.h"
28 #include <llvm/IR/Constants.h>
29 #include <llvm/IR/IRBuilder.h>
30 #include <llvm/Transforms/Utils/ValueMapper.h>
43 const bool contains_left_deep_outer_join,
45 CgenState(
const size_t num_query_infos,
const bool contains_left_deep_outer_join);
51 const int device_id) {
101 throw std::runtime_error(
102 "CHAR / VARCHAR NULL literal not supported in this context");
116 if (ti.get_subtype() ==
kDOUBLE) {
117 std::vector<double> double_array_literal;
121 double d = c->get_constval().doubleval;
122 double_array_literal.push_back(d);
126 if (ti.get_subtype() ==
kINT) {
127 std::vector<int32_t> int32_array_literal;
131 int32_t i = c->get_constval().intval;
132 int32_array_literal.push_back(i);
137 std::vector<int8_t> int8_array_literal;
141 int8_t i = c->get_constval().tinyintval;
142 int8_array_literal.push_back(i);
144 if (ti.get_comp_param() == 64) {
145 return getOrAddLiteral(std::make_pair(int8_array_literal, 64), device_id);
149 throw std::runtime_error(
"Unsupported literal array");
153 std::vector<int8_t> int8_array_literal;
157 int8_t i = c->get_constval().tinyintval;
158 int8_array_literal.push_back(i);
160 if (ti.get_comp_param() == 32) {
161 return getOrAddLiteral(std::make_pair(int8_array_literal, 32), device_id);
166 throw std::runtime_error(
"Encoded literal arrays are not supported");
179 std::pair<std::string, shared::StringDictKey>,
182 std::vector<int32_t>,
184 std::pair<std::vector<int8_t>,
int>>;
190 llvm::Value* str_lv =
ir_builder_.CreateGlobalString(
191 str,
"str_const_" +
std::to_string(std::hash<std::string>()(str)));
194 str_lv =
ir_builder_.CreateBitCast(str_lv, i8_ptr);
199 std::unique_ptr<const StringDictionaryTranslationMgr>&& str_dict_translation_mgr) {
205 std::unique_ptr<InValuesBitmap>& in_values_bitmap) {
206 if (in_values_bitmap->isEmpty()) {
207 return in_values_bitmap.get();
213 if (!in_values_bitmap->isEmpty()) {
220 const std::string& fname,
222 const std::vector<llvm::Value*>
args,
223 const std::vector<llvm::Attribute::AttrKind>& fnattrs = {},
224 const bool has_struct_return =
false);
225 llvm::Value*
emitCall(
const std::string& fname,
const std::vector<llvm::Value*>& args);
227 const std::vector<llvm::Value*>& args);
231 llvm::Value*
castToTypeIn(llvm::Value* val,
const size_t bit_width);
234 const size_t byte_width,
235 const bool is_signed);
242 llvm::ConstantInt*
llInt(
const T v)
const {
246 llvm::ConstantFP*
llFp(
const float v)
const {
247 return static_cast<llvm::ConstantFP*
>(
248 llvm::ConstantFP::get(llvm::Type::getFloatTy(
context_), v));
251 llvm::ConstantFP*
llFp(
const double v)
const {
252 return static_cast<llvm::ConstantFP*
>(
253 llvm::ConstantFP::get(llvm::Type::getDoubleTy(
context_), v));
267 bool always_clone =
false);
392 std::vector<std::unique_ptr<const StringDictionaryTranslationMgr>>
411 switch (lit.which()) {
441 static size_t addAligned(
const size_t off_in,
const size_t alignment) {
443 if (off % alignment != 0) {
444 off += (alignment - off % alignment);
446 return off + alignment;
455 size_t literal_found_off{0};
457 for (
const auto& literal : literals) {
459 literal_found_off =
addAligned(literal_found_off, lit_bytes);
460 if (literal == var_val) {
461 return {literal_found_off - lit_bytes, lit_bytes};
464 literals.emplace_back(val);
std::vector< llvm::Function * > helper_functions_
const std::list< std::shared_ptr< Analyzer::Expr > > & get_value_list() const
llvm::Value * castToTypeIn(llvm::Value *val, const size_t bit_width)
llvm::Value * emitEntryCall(const std::string &fname, const std::vector< llvm::Value * > &args)
std::vector< llvm::Value * > outer_join_match_found_per_level_
std::unordered_map< size_t, std::vector< llvm::Value * > > fetch_cache_
llvm::LLVMContext & getExecutorContext() const
std::shared_ptr< Executor > getExecutor() const
std::map< std::pair< llvm::Value *, llvm::Value * >, ArrayLoadCodegen > array_load_cache_
const Analyzer::FunctionOper * foper
llvm::Value * addStringConstant(const std::string &str)
void maybeCloneFunctionRecursive(llvm::Function *fn)
llvm::Function * query_func_
llvm::ConstantInt * ll_int(const T v, llvm::LLVMContext &context)
std::unordered_map< llvm::Value *, HoistedLiteralLoadLocator > row_func_hoisted_literals_
llvm::IRBuilder ir_builder_
int offset_in_literal_buffer
void moveInValuesBitmap(std::unique_ptr< const InValuesBitmap > &in_values_bitmap)
std::vector< llvm::Value * > str_constants_
llvm::ConstantInt * llBool(const bool v) const
std::unordered_map< int, std::vector< llvm::Value * > > query_func_literal_loads_
InsertionOrderedMap filter_func_args_
const bool contains_left_deep_outer_join_
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
const std::unordered_map< int, LiteralValues > & getLiterals() const
double inline_fp_null_val(const SQL_TYPE_INFO &ti)
std::unordered_map< std::string, llvm::Value * > geo_target_cache_
llvm::ConstantFP * llFp(const double v) const
static size_t literalBytes(const CgenState::LiteralValue &lit)
std::vector< FunctionOperValue > ext_call_cache_
llvm::Function * row_func_
boost::variant< int8_t, int16_t, int32_t, int64_t, float, double, std::pair< std::string, shared::StringDictKey >, std::string, std::vector< double >, std::vector< int32_t >, std::vector< int8_t >, std::pair< std::vector< int8_t >, int >> LiteralValue
std::vector< llvm::Value * > group_by_expr_cache_
llvm::LLVMContext & context_
llvm::Function * current_func_
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)
static size_t addAligned(const size_t off_in, const size_t alignment)
llvm::CallInst * filter_func_call_
llvm::ConstantInt * inlineIntNull(const SQLTypeInfo &)
std::vector< LiteralValue > LiteralValues
const InValuesBitmap * addInValuesBitmap(std::unique_ptr< InValuesBitmap > &in_values_bitmap)
void replaceFunctionForGpu(const std::string &fcn_to_replace, llvm::Function *fn)
std::unordered_map< int, size_t > literal_bytes_
std::unordered_map< int, llvm::Value * > scan_idx_to_hash_pos_
llvm::ConstantFP * llFp(const float v) const
std::vector< std::string > gpuFunctionsToReplace(llvm::Function *fn)
llvm::IRBuilder query_func_entry_ir_builder_
llvm::BasicBlock * filter_func_bb_
const SQLTypeInfo & get_type_info() const
llvm::Value * emitCall(const std::string &fname, const std::vector< llvm::Value * > &args)
SQLTypes decimal_to_int_type(const SQLTypeInfo &ti)
llvm::Constant * inlineNull(const SQLTypeInfo &)
void set_module_shallow_copy(const std::unique_ptr< llvm::Module > &module, bool always_clone=false)
std::vector< std::unique_ptr< const InValuesBitmap > > in_values_bitmaps_
llvm::Function * filter_func_
std::unordered_map< int, LiteralValues > literals_
std::vector< llvm::Value * > frag_offsets_
size_t getLiteralBufferUsage(const int device_id)
Datum get_constval() const
void emitErrorCheck(llvm::Value *condition, llvm::Value *errorCode, std::string label)
llvm::ConstantInt * llInt(const T v) const
int index_of_literal_load
llvm::ValueToValueMapTy vmap_
int64_t inline_int_null_val(const SQL_TYPE_INFO &ti)
llvm::ConstantInt * ll_bool(const bool v, llvm::LLVMContext &context)
const StringDictionaryTranslationMgr * moveStringDictionaryTranslationMgr(std::unique_ptr< const StringDictionaryTranslationMgr > &&str_dict_translation_mgr)
std::vector< std::unique_ptr< const StringDictionaryTranslationMgr > > str_dict_translation_mgrs_
std::tuple< size_t, size_t > getOrAddLiteral(const T &val, const int device_id)
llvm::CallInst * row_func_call_
CgenState(const size_t num_query_infos, const bool contains_left_deep_outer_join, Executor *executor)
std::pair< llvm::ConstantInt *, llvm::ConstantInt * > inlineIntMaxMin(const size_t byte_width, const bool is_signed)
llvm::BasicBlock * row_func_bb_
std::tuple< size_t, size_t > getOrAddLiteral(const Analyzer::Constant *constant, const EncodingType enc_type, const shared::StringDictKey &dict_id, const int device_id)
llvm::ConstantFP * inlineFpNull(const SQLTypeInfo &)