Skip to content

Commit e7086e4

Browse files
Prerak SinghPrerak Singh
authored andcommitted
bug fix
1 parent 1b80b9f commit e7086e4

File tree

1 file changed

+43
-42
lines changed

1 file changed

+43
-42
lines changed

pydatastructs/graphs/_backend/cpp/llvm_adjacency_list.py

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ def _create_add_vertex(self):
379379
self.builder.mul(current_capacity, ir.Constant(self.int_type, 2))
380380
)
381381

382-
ptr_size = ir.Constant(self.int64_type, self.node_type.as_pointer().get_abi_size(self._get_target_data()))
382+
ptr_size = ir.Constant(self.int64_type, 8)
383383
new_size_64 = self.builder.mul(self.builder.zext(new_capacity, self.int64_type), ptr_size)
384384
new_array_mem = self.builder.call(self.malloc_func, [new_size_64])
385385
new_array = self.builder.bitcast(new_array_mem, self.node_type.as_pointer().as_pointer())
@@ -527,60 +527,56 @@ def _add_to_adjacency_list(self, src_node_ptr, tgt_node_ptr):
527527
current_count = self.builder.load(adj_count_ptr)
528528
current_capacity = self.builder.load(adj_cap_ptr)
529529

530-
needs_allocation = self.builder.icmp_signed('==', current_capacity, ir.Constant(self.int_type, 0))
531530
needs_resize = self.builder.icmp_signed('>=', current_count, current_capacity)
532-
needs_realloc = self.builder.or_(needs_allocation, needs_resize)
533-
531+
534532
resize_adj_block = self.builder.block.parent.append_basic_block(name="resize_adj")
535533
add_adj_block = self.builder.block.parent.append_basic_block(name="add_adj")
536534

537-
self.builder.cbranch(needs_realloc, resize_adj_block, add_adj_block)
535+
self.builder.cbranch(needs_resize, resize_adj_block, add_adj_block)
538536

539537
self.builder.position_at_end(resize_adj_block)
540538
new_capacity = self.builder.select(
541-
needs_allocation,
539+
self.builder.icmp_signed('==', current_capacity, ir.Constant(self.int_type, 0)),
542540
ir.Constant(self.int_type, 1),
543541
self.builder.mul(current_capacity, ir.Constant(self.int_type, 2))
544542
)
545543

546-
node_ptr_type = self.node_type.as_pointer()
547-
ptr_size = ir.Constant(self.int64_type, node_ptr_type.get_abi_size(self._get_target_data()))
548-
new_size_elements = self.builder.zext(new_capacity, self.int64_type)
549-
new_array_mem = self.builder.call(self.malloc_func, [self.builder.mul(new_size_elements, ptr_size)])
550-
new_array = self.builder.bitcast(new_array_mem, node_ptr_type.as_pointer())
551-
552-
copy_adj_block = self.builder.block.parent.append_basic_block(name="copy_adj")
553-
store_new_block = self.builder.block.parent.append_basic_block(name="store_new")
554-
555-
has_existing_data = self.builder.icmp_signed('>', current_count, ir.Constant(self.int_type, 0))
556-
self.builder.cbranch(has_existing_data, copy_adj_block, store_new_block)
557-
558-
self.builder.position_at_end(copy_adj_block)
559-
old_adj_array_void = self.builder.load(adj_list_ptr)
560-
old_size_elements = self.builder.zext(current_count, self.int64_type)
561-
old_size_bytes = self.builder.mul(old_size_elements, ptr_size)
562-
563-
new_array_void = self.builder.bitcast(new_array, self.void_ptr)
564-
self.builder.call(self.memcpy_func, [new_array_void, old_adj_array_void, old_size_bytes])
565-
self.builder.call(self.free_func, [old_adj_array_void])
566-
self.builder.branch(store_new_block)
567-
568-
self.builder.position_at_end(store_new_block)
569-
new_array_as_void = self.builder.bitcast(new_array, self.void_ptr)
570-
self.builder.store(new_array_as_void, adj_list_ptr)
544+
ptr_size = ir.Constant(self.int64_type, 8)
545+
new_size_bytes = self.builder.mul(self.builder.zext(new_capacity, self.int64_type), ptr_size)
546+
new_array_mem = self.builder.call(self.malloc_func, [new_size_bytes])
547+
548+
old_adj_list = self.builder.load(adj_list_ptr)
549+
copy_needed = self.builder.icmp_signed('>', current_count, ir.Constant(self.int_type, 0))
550+
551+
copy_block = self.builder.block.parent.append_basic_block(name="copy_existing")
552+
store_block = self.builder.block.parent.append_basic_block(name="store_new_array")
553+
554+
self.builder.cbranch(copy_needed, copy_block, store_block)
555+
556+
self.builder.position_at_end(copy_block)
557+
old_size_bytes = self.builder.mul(self.builder.zext(current_count, self.int64_type), ptr_size)
558+
self.builder.call(self.memcpy_func, [new_array_mem, old_adj_list, old_size_bytes])
559+
self.builder.call(self.free_func, [old_adj_list])
560+
self.builder.branch(store_block)
561+
562+
self.builder.position_at_end(store_block)
563+
self.builder.store(new_array_mem, adj_list_ptr)
571564
self.builder.store(new_capacity, adj_cap_ptr)
572565
self.builder.branch(add_adj_block)
573566

574567
self.builder.position_at_end(add_adj_block)
575-
adj_array_void = self.builder.load(adj_list_ptr)
576-
adj_array_typed = self.builder.bitcast(adj_array_void, node_ptr_type.as_pointer())
568+
adj_array = self.builder.load(adj_list_ptr)
577569

578570
current_count_final = self.builder.load(adj_count_ptr)
579-
tgt_slot_ptr = self.builder.gep(adj_array_typed, [current_count_final])
580-
self.builder.store(tgt_node_ptr, tgt_slot_ptr)
571+
offset_bytes = self.builder.mul(self.builder.zext(current_count_final, self.int64_type), ptr_size)
572+
target_addr = self.builder.gep(adj_array, [offset_bytes])
581573

582-
new_adj_count = self.builder.add(current_count_final, ir.Constant(self.int_type, 1))
583-
self.builder.store(new_adj_count, adj_count_ptr)
574+
node_as_int = self.builder.ptrtoint(tgt_node_ptr, self.int64_type)
575+
node_bytes = self.builder.bitcast(target_addr, self.int64_type.as_pointer())
576+
self.builder.store(node_as_int, node_bytes)
577+
578+
new_count = self.builder.add(current_count_final, ir.Constant(self.int_type, 1))
579+
self.builder.store(new_count, adj_count_ptr)
584580

585581
def _create_hash_insert(self):
586582
insert_func_type = ir.FunctionType(self.int_type,
@@ -675,9 +671,15 @@ def _create_is_adjacent(self):
675671
self.builder.cbranch(loop_condition, adj_check_block, false_block)
676672

677673
self.builder.position_at_end(adj_check_block)
678-
adj_list_typed = self.builder.bitcast(adj_list_void, self.node_type.as_pointer().as_pointer())
679-
adj_entry_ptr = self.builder.gep(adj_list_typed, [i_val])
680-
adj_node = self.builder.load(adj_entry_ptr)
674+
adj_array = self.builder.load(adj_list_ptr)
675+
676+
ptr_size = ir.Constant(self.int64_type, 8)
677+
offset_bytes = self.builder.mul(self.builder.zext(i_val, self.int64_type), ptr_size)
678+
entry_addr = self.builder.gep(adj_array, [offset_bytes])
679+
680+
entry_as_int_ptr = self.builder.bitcast(entry_addr, self.int64_type.as_pointer())
681+
entry_as_int = self.builder.load(entry_as_int_ptr)
682+
adj_node = self.builder.inttoptr(entry_as_int, self.node_type.as_pointer())
681683

682684
nodes_match = self.builder.icmp_signed('==', adj_node, node2_ptr)
683685
self.builder.cbranch(nodes_match, true_block, adj_next_block)
@@ -945,8 +947,7 @@ def _remove_from_adjacency_list(self, src_node_ptr, tgt_node_ptr):
945947
adj_list_void = self.builder.load(adj_list_ptr)
946948
adj_count = self.builder.load(adj_count_ptr)
947949

948-
node_ptr_type = self.node_type.as_pointer()
949-
adj_list_typed = self.builder.bitcast(adj_list_void, node_ptr_type.as_pointer())
950+
adj_list_typed = self.builder.bitcast(adj_list_void, self.node_type.as_pointer().as_pointer())
950951

951952
i = self.builder.alloca(self.int_type, name="adj_i")
952953
self.builder.store(ir.Constant(self.int_type, 0), i)

0 commit comments

Comments
 (0)