@@ -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