| 674 | } |
| 675 | |
| 676 | llvm::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 | |
| 729 | llvm::Value* CodegenAnyVal::Compare(CodegenAnyVal* other, const char* name) { |
| 730 | DCHECK_EQ(type_, other->type_); |
no test coverage detected