package Ġorg . jetbrains . research . k ex . asm . analysis Ċ Ċ import Ġcom . abd ull in . k the l per . algorithm . Graph Traversal Ċ import Ġorg . jetbrains . research . k fg . ir . BasicBlock Ċ import Ġorg . jetbrains . research . k fg . ir . Method Ċ Ċ private Ġfun Ġbuild Block Mapping ( method : ĠMethod ): ĠMap < BasicBlock , ĠBasic Block > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < BasicBlock , ĠBasic Block >() ĊĠĠĠ Ġval Ġvisited Ġ= Ġmutable Set Of < BasicBlock >() ĊĊĠĠĠ Ġfor Ġ( block Ġin Ġmethod ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( block Ġin Ġvisited ) Ġcontinue ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < BasicBlock >() ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current . success ors . size Ġ!= Ġ 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess or Ġ= Ġcurrent . success ors . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success or . pre decess ors . size Ġ!= Ġ 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ+= Ġcurrent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġsuccess or ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġlist . last OrNull () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠ Ġfor Ġ( b Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult [ b ] Ġ= Ġlast ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisited Ġ+= Ġb ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun Ġfilter Block Order ( method : ĠMethod , Ġorder : ĠList < BasicBlock >): ĠList < BasicBlock > Ġ{ ĊĠĠĠ Ġval Ġmapping Ġ= Ġbuild Block Mapping ( method ) ĊĠĠĠ Ġval Ġmapped Ġ= Ġorder . map Ġ{ Ġmapping . get OrDefault ( it , Ġit ) Ġ} ĊĠĠĠ Ġval Ġfiltered Mapping Ġ= Ġmutable ListOf < BasicBlock >() ĊĠĠĠ Ġfor Ġ( block Ġin Ġmapped ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( block Ġ! in Ġfiltered Mapping ) Ġfiltered Mapping Ġ+= Ġblock ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfiltered Mapping Ċ } Ċ Ċ interface ĠSearch Strategy Ġ: ĠIterable < BasicBlock > Ġ{ ĊĠĠĠ Ġval Ġmethod : ĠMethod Ċ } Ċ Ċ class ĠTop ological Strategy ( override Ġval Ġmethod : ĠMethod ) Ġ: ĠSearch Strategy Ġ{ ĊĠĠĠ Ġval Ġorder : ĠList < BasicBlock > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtp Order Ġ= ĠGraph Traversal ( method ). topo logical Sort () ĊĠĠĠĠĠĠĠ Ġorder Ġ= Ġfilter Block Order ( method , Ġtp Order ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator () Ġ= Ġorder . iterator () Ċ } Ċ Ċ class ĠB fs Strategy ( override Ġval Ġmethod : ĠMethod ) Ġ: ĠSearch Strategy Ġ{ ĊĠĠĠ Ġval Ġb fs Search : ĠList < BasicBlock > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġb fs Order Ġ= ĠGraph Traversal ( method ). b fs () ĊĠĠĠĠĠĠĠ Ġb fs Search Ġ= Ġfilter Block Order ( method , Ġb fs Order ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator () Ġ= Ġb fs Search . iterator () Ċ } Ċ Ċ class ĠD fs Strategy ( override Ġval Ġmethod : ĠMethod ) Ġ: ĠSearch Strategy Ġ{ ĊĠĠĠ Ġval Ġdfs Search : ĠList < BasicBlock > ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdfs Order Ġ= ĠGraph Traversal ( method ). dfs () ĊĠĠĠĠĠĠĠ Ġdfs Search Ġ= Ġfilter Block Order ( method , Ġdfs Order ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġiterator () Ġ= Ġdfs Search . iterator () Ċ } Ċ