OmniSciDB  c1a53651b2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CodeGenerator::NullCheckCodegen Struct Reference

#include <CodeGenerator.h>

+ Collaboration diagram for CodeGenerator::NullCheckCodegen:

Public Member Functions

 NullCheckCodegen (CgenState *cgen_state, Executor *executor, llvm::Value *nullable_lv, const SQLTypeInfo &nullable_ti, const std::string &name="")
 
llvm::Value * finalize (llvm::Value *null_lv, llvm::Value *notnull_lv)
 

Public Attributes

CgenStatecgen_state {nullptr}
 
std::string name
 
llvm::BasicBlock * nullcheck_bb {nullptr}
 
llvm::PHINode * nullcheck_value {nullptr}
 
std::unique_ptr< DiamondCodegennull_check
 

Detailed Description

Definition at line 132 of file CodeGenerator.h.

Constructor & Destructor Documentation

CodeGenerator::NullCheckCodegen::NullCheckCodegen ( CgenState cgen_state,
Executor executor,
llvm::Value *  nullable_lv,
const SQLTypeInfo nullable_ti,
const std::string &  name = "" 
)

Definition at line 1426 of file IRCodegen.cpp.

References AUTOMATIC_IR_METADATA, CHECK, CgenState::context_, CgenState::current_func_, CodeGenerator::executor(), CgenState::inlineFpNull(), CgenState::inlineIntNull(), CgenState::ir_builder_, SQLTypeInfo::is_boolean(), SQLTypeInfo::is_dict_encoded_string(), SQLTypeInfo::is_fp(), SQLTypeInfo::is_number(), SQLTypeInfo::is_time(), CgenState::llBool(), name, null_check, and nullcheck_bb.

1431  : cgen_state(cgen_state), name(name) {
1432  AUTOMATIC_IR_METADATA(cgen_state);
1433  CHECK(nullable_ti.is_number() || nullable_ti.is_time() || nullable_ti.is_boolean() ||
1434  nullable_ti.is_dict_encoded_string());
1435 
1436  llvm::Value* is_null_lv{nullptr};
1437  if (nullable_ti.is_fp()) {
1438  is_null_lv = cgen_state->ir_builder_.CreateFCmp(
1439  llvm::FCmpInst::FCMP_OEQ, nullable_lv, cgen_state->inlineFpNull(nullable_ti));
1440  } else if (nullable_ti.is_boolean() &&
1441  nullable_lv->getType()->getIntegerBitWidth() == 1) {
1442  is_null_lv = cgen_state->ir_builder_.CreateICmp(
1443  llvm::ICmpInst::ICMP_EQ, nullable_lv, cgen_state->llBool(true));
1444  } else {
1445  is_null_lv = cgen_state->ir_builder_.CreateICmp(
1446  llvm::ICmpInst::ICMP_EQ, nullable_lv, cgen_state->inlineIntNull(nullable_ti));
1447  }
1448  CHECK(is_null_lv);
1449  null_check =
1450  std::make_unique<DiamondCodegen>(is_null_lv, executor, false, name, nullptr, false);
1451 
1452  // generate a phi node depending on whether we got a null or not
1453  nullcheck_bb = llvm::BasicBlock::Create(
1454  cgen_state->context_, name + "_bb", cgen_state->current_func_);
1455 
1456  // update the blocks created by diamond codegen to point to the newly created phi
1457  // block
1458  cgen_state->ir_builder_.SetInsertPoint(null_check->cond_true_);
1459  cgen_state->ir_builder_.CreateBr(nullcheck_bb);
1460  cgen_state->ir_builder_.SetInsertPoint(null_check->cond_false_);
1461 }
llvm::BasicBlock * nullcheck_bb
bool is_fp() const
Definition: sqltypes.h:584
llvm::IRBuilder ir_builder_
Definition: CgenState.h:377
llvm::ConstantInt * llBool(const bool v) const
Definition: CgenState.h:256
bool is_number() const
Definition: sqltypes.h:585
bool is_time() const
Definition: sqltypes.h:586
llvm::LLVMContext & context_
Definition: CgenState.h:375
llvm::Function * current_func_
Definition: CgenState.h:369
llvm::ConstantInt * inlineIntNull(const SQLTypeInfo &)
Definition: CgenState.cpp:64
bool is_boolean() const
Definition: sqltypes.h:587
#define AUTOMATIC_IR_METADATA(CGENSTATE)
#define CHECK(condition)
Definition: Logger.h:291
bool is_dict_encoded_string() const
Definition: sqltypes.h:632
std::unique_ptr< DiamondCodegen > null_check
llvm::ConstantFP * inlineFpNull(const SQLTypeInfo &)
Definition: CgenState.cpp:103
Executor * executor() const

+ Here is the call graph for this function:

Member Function Documentation

llvm::Value * CodeGenerator::NullCheckCodegen::finalize ( llvm::Value *  null_lv,
llvm::Value *  notnull_lv 
)

Definition at line 1463 of file IRCodegen.cpp.

References AUTOMATIC_IR_METADATA, CHECK, CHECK_EQ, and setup::name.

Referenced by spatial_type::Transform::codegen().

1464  {
1466  CHECK(null_check);
1467  cgen_state->ir_builder_.CreateBr(nullcheck_bb);
1468 
1469  CHECK_EQ(null_lv->getType(), notnull_lv->getType());
1470 
1471  cgen_state->ir_builder_.SetInsertPoint(nullcheck_bb);
1472  nullcheck_value =
1473  cgen_state->ir_builder_.CreatePHI(null_lv->getType(), 2, name + "_value");
1474  nullcheck_value->addIncoming(notnull_lv, null_check->cond_false_);
1475  nullcheck_value->addIncoming(null_lv, null_check->cond_true_);
1476 
1477  null_check.reset(nullptr);
1478  cgen_state->ir_builder_.SetInsertPoint(nullcheck_bb);
1479  return nullcheck_value;
1480 }
#define CHECK_EQ(x, y)
Definition: Logger.h:301
llvm::BasicBlock * nullcheck_bb
llvm::IRBuilder ir_builder_
Definition: CgenState.h:377
#define AUTOMATIC_IR_METADATA(CGENSTATE)
#define CHECK(condition)
Definition: Logger.h:291
std::unique_ptr< DiamondCodegen > null_check

+ Here is the caller graph for this function:

Member Data Documentation

CgenState* CodeGenerator::NullCheckCodegen::cgen_state {nullptr}

Definition at line 141 of file CodeGenerator.h.

std::unique_ptr<DiamondCodegen> CodeGenerator::NullCheckCodegen::null_check

Definition at line 145 of file CodeGenerator.h.

Referenced by NullCheckCodegen().

llvm::BasicBlock* CodeGenerator::NullCheckCodegen::nullcheck_bb {nullptr}

Definition at line 143 of file CodeGenerator.h.

Referenced by NullCheckCodegen().

llvm::PHINode* CodeGenerator::NullCheckCodegen::nullcheck_value {nullptr}

Definition at line 144 of file CodeGenerator.h.


The documentation for this struct was generated from the following files: