package Ġpar s ley . backend Ċ Ċ import Ġpar s ley . backend . instructions . Call Ċ import Ġpar s ley . backend . instructions . Label Ċ import Ġpar s ley . backend . instructions . Return Ċ import Ġpar s ley . collections . Int Map Ċ import Ġpar s ley . collections . Int Set Ċ import Ġpar s ley . unsafe Ċ Ċ fun Ġ< I , ĠE > Ġassemble ( ĊĠĠĠ Ġmain : ĠMethod < I , ĠE >, ĊĠĠĠ Ġsub : ĠInt Map < Method < I , ĠE >> Ċ ): ĠMethod < I , ĠE > Ġ{ ĊĠĠĠ Ġ// Ġinline Ġsingle Ġcalls ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= ĠInt Map . empty < Int >() ĊĠĠĠĠĠĠĠ Ġmain . forEach Ġ{ Ġif Ġ( it Ġis ĠCall ) Ġcalls [ it . to ] Ġ= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġsub . forEach Ġ{ Ġ_, Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠCall ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . to Ġin Ġcalls ) Ġcalls [ it . to ] Ġ= Ġcalls [ it . to ] Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġcalls [ it . to ] Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcalls . filter Values Ġ{ Ġit Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġmain . inline ( calls . keySet (), Ġsub ) ĊĠĠĠĠĠĠĠ Ġsub . forEach Ġ{ Ġ_, Ġit Ġ-> Ġit . inline ( calls . keySet (), Ġsub ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( calls . size () Ġ== Ġ 0 ) Ġbreak ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġremove Ġdead Ġcode ĊĠĠĠ Ġval Ġseen Ġ= ĠInt Set . empty () ĊĠĠĠ Ġval Ġdone Ġ= ĠInt Set . empty () ĊĠĠĠ Ġmain . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠCall ) Ġseen . add ( it . to ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhile Ġ( seen . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġseen . first () ĊĠĠĠĠĠĠĠ Ġseen . remove ( next ) ĊĠĠĠĠĠĠĠ Ġsub [ next ]. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠCall Ġ&& Ġdone . contains ( it . to ). not ()) Ġseen . add ( it . to ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdone . add ( next ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsub . filter Keys Ġ{ Ġdone . contains ( it ) Ġ} ĊĊĠĠĠ Ġ// ĠInline Ġsingle Ġtop Ġlevel ĠCall Ġif Ġnecessary ĊĠĠĠ Ġval Ġmain Ġ= Ġif Ġ( main . size Ġ== Ġ 1 Ġ&& Ġmain [ 0 ] Ġis ĠCall ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġmain [ 0 ]. unsafe < Call < I , ĠE >> (). to ĊĠĠĠĠĠĠĠ Ġsub [ to ]. apply Ġ{ Ġadd ( 0 , ĠLabel ( to )) Ġ}. also Ġ{ Ġsub . remove ( to ) Ġ} ĊĠĠĠ Ġ} Ġelse Ġmain ĊĊĠĠĠ Ġ// Ġsp lice Ġtogether Ġthe Ġprogram ĊĠĠĠ Ġval Ġmut List Ġ= Ġmutable ListOf < Instruction < I , ĠE >>() ĊĠĠĠ Ġmut List . addAll ( main . instructions ) ĊĠĠĠ Ġmut List Ġ+= ĠReturn () ĊĠĠĠ Ġsub . forEach Ġ{ Ġkey , Ġmethod Ġ-> ĊĠĠĠĠĠĠĠ Ġmut List Ġ+= ĠLabel ( key ) ĊĠĠĠĠĠĠĠ Ġmut List . addAll ( method . instructions ) ĊĠĠĠĠĠĠĠ Ġmut List Ġ+= ĠReturn () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġreplace Ġlabels ĊĠĠĠ Ġval Ġjump Table Ġ= ĠInt Map . empty < Int >() ĊĠĠĠ Ġvar Ġcurr Ġ= Ġmut List . size ĊĠĠĠ Ġval Ġprocessed Ġ= Ġmutable Set Of < Instruction < I , ĠE >>() ĊĠĠĠ Ġfun Ġfind Label ( i : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġin Ġjump Table ) Ġreturn Ġjump Table [ i ] ĊĊĠĠĠĠĠĠĠ Ġvar Ġci Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġlabels Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġel Ġ= Ġmut List [ ci ++] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel Ġis ĠLabel Ġ&& Ġel . id Ġ!= Ġi Ġ-> Ġlabels ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel Ġis ĠLabel Ġ&& Ġel . id Ġ== Ġi Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ci Ġ< Ġcurr ) Ġcurr -- ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġci Ġ- Ġ 1 Ġ- Ġlabels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjump Table [ i ] Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmut List . remove At ( ci Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( ci Ġ< Ġmut List . size ) ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Label Ġwas Ġnot Ġfound ! ĠThis Ġis Ġa Ġcodegen Ġbug ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhile Ġ( curr Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġel Ġ= Ġmut List [ -- curr ] ĊĠĠĠĠĠĠĠ Ġif Ġ( processed . contains ( el )) Ġcontinue ĊĠĠĠĠĠĠĠ Ġprocessed . add ( el ) ĊĠĠĠĠĠĠĠ Ġif Ġ( el Ġis ĠJump s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( el . on Assembly Ġ{ Ġfind Label ( it ) Ġ}) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġel . to Ġ= Ġfind Label ( el . to ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġmut List . removeAll Ġ{ Ġit Ġis ĠLabel Ġ} ĊĠĠĠ Ġreturn ĠMethod ( mut List ) Ċ }