class Bpl::LoopIdentification
Public Instance Methods
run!(program)
click to toggle source
# File lib/bpl/passes/analysis/loop_identification.rb, line 8 def run! program dominators = domination.dominators cfg = cfg_construction program.declarations.each do |proc| next unless proc.is_a?(ProcedureDeclaration) && proc.body proc.body.blocks.each do |blk| (dominators[blk] & cfg.successors[blk]).each do |head| loops[head] = Set.new loops[head].merge([head,blk]) work_list = [blk] until work_list.empty? cfg.predecessors[work_list.shift].each do |pred| next if loops[head].include?(pred) loops[head].add(pred) work_list |= [pred] end end loops[head] = proc.body.blocks.select{|b| loops[head].include?(b)} end end end end