Skip to content

Commit 320192d

Browse files
advikkabraczgdp1807
authored andcommitted
Not calculate hash when capacity is nil
1 parent 4b06d70 commit 320192d

File tree

1 file changed

+22
-6
lines changed

1 file changed

+22
-6
lines changed

src/libasr/codegen/asr_to_llvm.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1726,9 +1726,17 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
17261726
ptr_loads = ptr_loads_copy;
17271727
llvm::Value *capacity = LLVM::CreateLoad(*builder,
17281728
llvm_utils->dict_api->get_pointer_to_capacity(right));
1729-
llvm::Value *key_hash = llvm_utils->dict_api->get_key_hash(capacity, left, dict_type->m_key_type, *module);
1730-
1731-
tmp = llvm_utils->dict_api->resolve_collision_for_read_with_bound_check(right, key_hash, left, *module, dict_type->m_key_type, dict_type->m_value_type, true);
1729+
get_builder0();
1730+
llvm::AllocaInst *res = builder0.CreateAlloca(llvm::Type::getInt1Ty(context), nullptr);
1731+
llvm_utils->create_if_else(builder->CreateICmpEQ(
1732+
capacity, llvm::ConstantInt::get(llvm::Type::getInt32Ty(context), llvm::APInt(32, 0))),
1733+
[&]() {
1734+
LLVM::CreateStore(*builder, llvm::ConstantInt::get(llvm::Type::getInt1Ty(context), llvm::APInt(1, 0)), res);
1735+
}, [&]() {
1736+
llvm::Value *key_hash = llvm_utils->dict_api->get_key_hash(capacity, left, dict_type->m_key_type, *module);
1737+
LLVM::CreateStore(*builder, llvm_utils->dict_api->resolve_collision_for_read_with_bound_check(right, key_hash, left, *module, dict_type->m_key_type, dict_type->m_value_type, true), res);
1738+
});
1739+
tmp = LLVM::CreateLoad(*builder, res);
17321740
}
17331741

17341742
void visit_SetContains(const ASR::SetContains_t &x) {
@@ -1748,9 +1756,17 @@ class ASRToLLVMVisitor : public ASR::BaseVisitor<ASRToLLVMVisitor>
17481756
ptr_loads = ptr_loads_copy;
17491757
llvm::Value *capacity = LLVM::CreateLoad(*builder,
17501758
llvm_utils->set_api->get_pointer_to_capacity(right));
1751-
llvm::Value *el_hash = llvm_utils->set_api->get_el_hash(capacity, left, el_type, *module);
1752-
1753-
tmp = llvm_utils->set_api->resolve_collision_for_read_with_bound_check(right, el_hash, left, *module, el_type, false, true);
1759+
get_builder0();
1760+
llvm::AllocaInst *res = builder0.CreateAlloca(llvm::Type::getInt1Ty(context), nullptr);
1761+
llvm_utils->create_if_else(builder->CreateICmpEQ(
1762+
capacity, llvm::ConstantInt::get(llvm::Type::getInt32Ty(context), llvm::APInt(32, 0))),
1763+
[&]() {
1764+
LLVM::CreateStore(*builder, llvm::ConstantInt::get(llvm::Type::getInt1Ty(context), llvm::APInt(1, 0)), res);
1765+
}, [&]() {
1766+
llvm::Value *el_hash = llvm_utils->set_api->get_el_hash(capacity, left, el_type, *module);
1767+
LLVM::CreateStore(*builder, llvm_utils->set_api->resolve_collision_for_read_with_bound_check(right, el_hash, left, *module, el_type, false, true), res);
1768+
});
1769+
tmp = LLVM::CreateLoad(*builder, res);
17541770
}
17551771

17561772
void visit_DictLen(const ASR::DictLen_t& x) {

0 commit comments

Comments
 (0)