@@ -151,11 +151,10 @@ def _build_insertion_sort_ir(dtype: str) -> str:
151151
152152 fn_ty = ir .FunctionType (ir .VoidType (), [T .as_pointer (), i32 ])
153153 fn = ir .Function (mod , fn_ty , name = fn_name )
154-
155154 arr , n = fn .args
156155 arr .name , n .name = "arr" , "n"
157156
158- # Basic blocks
157+ # --- Basic blocks ---
159158 b_entry = fn .append_basic_block ("entry" )
160159 b_outer = fn .append_basic_block ("outer" )
161160 b_inner_cond = fn .append_basic_block ("inner.cond" )
@@ -165,27 +164,32 @@ def _build_insertion_sort_ir(dtype: str) -> str:
165164 b_exit = fn .append_basic_block ("exit" )
166165
167166 b = ir .IRBuilder (b_entry )
168-
169167 cond_trivial = b .icmp_signed ("<=" , n , ir .Constant (i32 , 1 ))
170168 b .cbranch (cond_trivial , b_exit , b_outer )
171169
170+ # --- Outer loop ---
172171 b .position_at_end (b_outer )
173172 i_phi = b .phi (i32 , name = "i" )
174- i_phi .add_incoming (ir .Constant (i32 , 1 ), b_entry ) # start from 1 for insertion sort
173+ i_phi .add_incoming (ir .Constant (i32 , 1 ), b_entry )
175174
176175 cond_outer = b .icmp_signed ("<" , i_phi , n )
177176 b .cbranch (cond_outer , b_inner_cond , b_exit )
178177
178+ # --- Inner loop condition ---
179179 b .position_at_end (b_inner_cond )
180+ # PHI first
181+ j_phi = b .phi (i32 , name = "j" )
182+ j_phi .add_incoming (i_phi , b_outer )
183+ # Note: add incoming from inner.latch later after defining b_inner_latch
184+
185+ # Load key after PHI
180186 key_ptr = b .gep (arr , [i_phi ])
181187 key_val = b .load (key_ptr , name = "key_val" )
182188
183- j_phi = b .phi (i32 , name = "j" )
184- j_phi .add_incoming (i_phi , b_outer ) # j = i
185-
186- inner_cond = b .icmp_signed (">" , j_phi , ir .Constant (i32 , 0 ))
187- b .cbranch (inner_cond , b_inner_body , b_outer_latch )
189+ cond_inner = b .icmp_signed (">" , j_phi , ir .Constant (i32 , 0 ))
190+ b .cbranch (cond_inner , b_inner_body , b_outer_latch )
188191
192+ # --- Inner loop body ---
189193 b .position_at_end (b_inner_body )
190194 j_minus_1 = b .sub (j_phi , ir .Constant (i32 , 1 ))
191195 ptr_j_minus_1 = b .gep (arr , [j_minus_1 ])
@@ -194,14 +198,16 @@ def _build_insertion_sort_ir(dtype: str) -> str:
194198 cmp = b .icmp_signed (">" , val_j_minus_1 , key_val ) if isinstance (T , ir .IntType ) else b .fcmp_ordered (">" , val_j_minus_1 , key_val )
195199 b .cbranch (cmp , b_inner_latch , b_outer_latch )
196200
201+ # --- Inner loop latch (shift element left) ---
197202 b .position_at_end (b_inner_latch )
198203 ptr_j = b .gep (arr , [j_phi ])
199204 b .store (val_j_minus_1 , ptr_j )
200205
201206 j_next = b .sub (j_phi , ir .Constant (i32 , 1 ))
202- j_phi .add_incoming (j_next , b_inner_latch )
207+ j_phi .add_incoming (j_next , b_inner_latch ) # now PHI incoming from latch
203208 b .branch (b_inner_cond )
204209
210+ # --- Outer latch (store key and increment i) ---
205211 b .position_at_end (b_outer_latch )
206212 ptr_j = b .gep (arr , [j_phi ])
207213 b .store (key_val , ptr_j )
@@ -210,12 +216,13 @@ def _build_insertion_sort_ir(dtype: str) -> str:
210216 i_phi .add_incoming (i_next , b_outer_latch )
211217 b .branch (b_outer )
212218
213- # Exit
219+ # --- Exit ---
214220 b .position_at_end (b_exit )
215221 b .ret_void ()
216222
217223 return str (mod )
218224
225+
219226def _materialize (dtype : str , algo : str ) -> int :
220227 _ensure_target_machine ()
221228
0 commit comments