class Bpl::UnreachableBlockElimination
Public Instance Methods
exists_path?(entry, target, cfg)
click to toggle source
# File lib/bpl/passes/transformation/unreachable_block_elimination.rb, line 12 def exists_path?(entry, target, cfg) visited = Set.new work_list = [entry] until work_list.empty? block = work_list.shift next if visited.include? block visited.add block work_list |= cfg.successors[block].to_a end visited.include? target end
run!(program)
click to toggle source
# File lib/bpl/passes/transformation/unreachable_block_elimination.rb, line 26 def run! program cfg = cfg_construction program.declarations.each do |proc| next unless proc.is_a?(ProcedureDeclaration) && proc.body entry = proc.body.blocks.first more = true while more more = false proc.body.blocks.each do |blk| if !exists_path?(entry, blk, cfg) more = true blk.remove cfg.predecessors[blk].each {|p| cfg.successors[p].delete(blk)} cfg.successors[blk].each {|s| cfg.predecessors[s].delete(blk)} cfg.predecessors.delete blk cfg.successors.delete blk end end end end end