@@ -2574,51 +2574,50 @@ function cfg_simplify!(ir::IRCode)
25742574 values = phi. values
25752575 (; ssa_rename, late_fixup, used_ssas, new_new_used_ssas) = compact
25762576 ssa_rename[i] = SSAValue (compact. result_idx)
2577- already_inserted = function (i :: Int , val:: OldSSAValue )
2577+ already_inserted = function (branch :: Int , val:: OldSSAValue )
25782578 if val. id in old_bb_stmts
25792579 return val. id <= i
25802580 end
2581- return bb_rename_pred[phi. edges[i ]] < idx
2581+ return 0 < bb_rename_pred[phi. edges[branch ]] < idx
25822582 end
2583- renamed_values = process_phinode_values (values, late_fixup, already_inserted, compact. result_idx, ssa_rename, used_ssas, new_new_used_ssas, true , nothing )
25842583 edges = Int32[]
25852584 values = Any[]
2586- sizehint! (edges, length (phi. edges)); sizehint! (values, length (renamed_values ))
2585+ sizehint! (edges, length (phi. edges)); sizehint! (values, length (phi . values ))
25872586 for old_index in 1 : length (phi. edges)
25882587 old_edge = phi. edges[old_index]
25892588 new_edge = bb_rename_pred[old_edge]
25902589 if new_edge > 0
25912590 push! (edges, new_edge)
2592- if isassigned (renamed_values, old_index)
2593- push! (values, renamed_values[old_index])
2591+ if isassigned (phi. values, old_index)
2592+ val = process_phinode_value (phi. values, old_index, late_fixup, already_inserted, compact. result_idx, ssa_rename, used_ssas, new_new_used_ssas, true , nothing )
2593+ push! (values, val)
25942594 else
25952595 resize! (values, length (values)+ 1 )
25962596 end
25972597 elseif new_edge == - 1
25982598 @assert length (phi. edges) == 1
2599- if isassigned (renamed_values, old_index)
2599+ if isassigned (phi. values, old_index)
2600+ val = process_phinode_value (phi. values, old_index, late_fixup, already_inserted, compact. result_idx, ssa_rename, used_ssas, new_new_used_ssas, true , nothing )
26002601 push! (edges, - 1 )
2601- push! (values, renamed_values[old_index] )
2602+ push! (values, val )
26022603 end
26032604 elseif new_edge == - 3
26042605 # Multiple predecessors, we need to expand out this phi
26052606 all_new_preds = Int32[]
26062607 add_preds! (all_new_preds, bbs, bb_rename_pred, old_edge)
26072608 append! (edges, all_new_preds)
2608- if isassigned (renamed_values, old_index)
2609- val = renamed_values[old_index]
2610- for _ in 1 : length (all_new_preds)
2611- push! (values, val)
2609+ np = length (all_new_preds)
2610+ if np > 0
2611+ if isassigned (phi. values, old_index)
2612+ val = process_phinode_value (phi. values, old_index, late_fixup, already_inserted, compact. result_idx, ssa_rename, used_ssas, new_new_used_ssas, true , nothing )
2613+ for p in 1 : np
2614+ push! (values, val)
2615+ p > 2 && count_added_node! (compact, val)
2616+ end
2617+ else
2618+ resize! (values, length (values)+ np)
26122619 end
2613- length (all_new_preds) == 0 && kill_current_use! (compact, val)
2614- for _ in 2 : length (all_new_preds)
2615- count_added_node! (compact, val)
2616- end
2617- else
2618- resize! (values, length (values)+ length (all_new_preds))
26192620 end
2620- else
2621- isassigned (renamed_values, old_index) && kill_current_use! (compact, renamed_values[old_index])
26222621 end
26232622 end
26242623 if length (edges) == 0 || (length (edges) == 1 && ! isassigned (values, 1 ))
0 commit comments