MCPcopy Create free account
hub / github.com/apache/impala / EqToNativePtr

Method EqToNativePtr

be/src/codegen/codegen-anyval.cc:676–727  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

674}
675
676llvm::Value* CodegenAnyVal::EqToNativePtr(llvm::Value* native_ptr,
677 bool inclusive_equality) {
678 llvm::Value* val = NULL;
679 if (!type_.IsStringType()) {
680 val = builder_->CreateLoad(native_ptr);
681 }
682 switch (type_.type) {
683 case TYPE_NULL:
684 return codegen_->false_value();
685 case TYPE_BOOLEAN:
686 case TYPE_TINYINT:
687 case TYPE_SMALLINT:
688 case TYPE_INT:
689 case TYPE_BIGINT:
690 case TYPE_DECIMAL:
691 case TYPE_DATE:
692 return builder_->CreateICmpEQ(GetVal(), val, "cmp_raw");
693 case TYPE_FLOAT:
694 case TYPE_DOUBLE:{
695 // Use the ordering version "OEQ" to ensure that 'nan' != 'nan'.
696 llvm::Value* local_val = GetVal();
697 llvm::Value* cmp_raw = builder_->CreateFCmpOEQ(local_val, val, "cmp_raw");
698 if (!inclusive_equality) return cmp_raw;
699
700 // Mirror logic in HashTableCtx::Equals - IMPALA-6661
701 llvm::Value* local_is_nan = builder_->CreateFCmpUNO(local_val,
702 local_val, "local_val_is_nan");
703 llvm::Value* val_is_nan = builder_->CreateFCmpUNO(val, val, "val_is_nan");
704 llvm::Value* both_nan = builder_->CreateAnd(local_is_nan, val_is_nan);
705
706 return builder_->CreateOr(cmp_raw, both_nan, "cmp_raw_with_nan");
707 }
708 case TYPE_STRING:
709 case TYPE_VARCHAR:
710 case TYPE_CHAR:
711 case TYPE_FIXED_UDA_INTERMEDIATE: {
712 llvm::Function* eq_fn =
713 codegen_->GetFunction(IRFunction::CODEGEN_ANYVAL_STRING_VALUE_EQ, false);
714 return builder_->CreateCall(eq_fn,
715 llvm::ArrayRef<llvm::Value*>({GetUnloweredPtr(), native_ptr}), "cmp_raw");
716 }
717 case TYPE_TIMESTAMP: {
718 llvm::Function* eq_fn =
719 codegen_->GetFunction(IRFunction::CODEGEN_ANYVAL_TIMESTAMP_VALUE_EQ, false);
720 return builder_->CreateCall(eq_fn,
721 llvm::ArrayRef<llvm::Value*>({GetUnloweredPtr(), native_ptr}), "cmp_raw");
722 }
723 default:
724 DCHECK(false) << "NYI: " << type_.DebugString();
725 return NULL;
726 }
727}
728
729llvm::Value* CodegenAnyVal::Compare(CodegenAnyVal* other, const char* name) {
730 DCHECK_EQ(type_, other->type_);

Callers 1

CodegenEqualsMethod · 0.80

Calls 5

IsStringTypeMethod · 0.80
false_valueMethod · 0.80
CreateCallMethod · 0.80
GetFunctionMethod · 0.45
DebugStringMethod · 0.45

Tested by

no test coverage detected