package Ġas mb le . ast . opt Ċ Ċ import Ġas mb le . ast . Node Ċ import Ġas mb le . ast . Stack Ċ Ċ // ĠThis Ġis Ġa Ġna ive Ġimplementation Ġthat Ġjust Ġgr abs Ġadjacent Ġsets Ġof Ġrestricted Ġins ns Ġand Ġbreaks Ġthe Ġone Ġthat Ġwill Ġsave Ċ // Ġthe Ġmost Ġinstructions Ġoff Ġinto Ġits Ġown Ġfunction . Ċ open Ġclass ĠSplit Large Func ( ĊĠĠĠ Ġval Ġmin Set Length : ĠInt Ġ= Ġ 5 , ĊĠĠĠ Ġval Ġmax Set Length : ĠInt Ġ= Ġ 4 0 , ĊĠĠĠ Ġval Ġmax Param Count : ĠInt Ġ= Ġ 3 0 Ċ ) Ġ{ ĊĊĠĠĠ Ġ// ĠNull Ġif Ġno Ġreplacement . ĠSecond Ġvalue Ġis Ġnumber Ġof Ġinstructions Ġsaved . Ġfn Index Ġmust Ġmap Ġto Ġactual Ġfunc , ĊĠĠĠ Ġ// Ġnot Ġimported Ġone . ĊĠĠĠ Ġfun Ġapply ( mod : ĠNode . Module , Ġfn Index : ĠInt ): ĠPair < Node . Module , ĠInt >? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġfunc ĊĠĠĠĠĠĠĠ Ġval Ġimport Func Count Ġ= Ġmod . imports . count Ġ{ Ġit . kind Ġis ĠNode . Import . Kind . Func Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġactual Fn Index Ġ= Ġfn Index Ġ- Ġimport Func Count ĊĠĠĠĠĠĠĠ Ġval Ġfunc Ġ= Ġmod . funcs . getOrElse ( actual Fn Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Unable Ġto Ġfind Ġnon - import Ġfunc Ġat Ġ$ fn Index Ġ( actual Ġ$ actual Fn Index )") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠJust Ġtake Ġthe Ġbest Ġpattern Ġand Ġapply Ġit ĊĠĠĠĠĠĠĠ Ġval Ġnew Func Index Ġ= Ġimport Func Count Ġ+ Ġmod . funcs . size ĊĠĠĠĠĠĠĠ Ġreturn Ġcommon Patterns ( mod , Ġfunc ). first OrNull ()?. let Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠName Ġit Ġas Ġ< func name >$ split N Ġ( n Ġis Ġnum Ġjust Ġto Ġdis amb igu ate ) Ġif Ġnames Ġare Ġpart Ġof Ġthe Ġmod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewName Ġ= Ġmod . names ?. func Names ?. get ( fn Index )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ it \$ split ". let Ġ{ Ġit Ġ+ Ġmod . names . func Names . count Ġ{ Ġ(_, Ġv ) Ġ-> Ġv . startsWith ( it ) Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGo Ġover Ġevery Ġreplacement Ġin Ġreverse , Ġchanging Ġthe Ġinstructions Ġto Ġour Ġnew Ġset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Ins ns Ġ= Ġpattern . replacement s . fold Right ( func . instructions ) Ġ{ Ġrepl , Ġins ns Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġins ns . take ( repl . range . start ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepl . pre Call Consts Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNode . Instr . Call ( new Func Index ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġins ns . drop ( repl . range . end Inclusive Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġmodule Ġw / Ġthe Ġnew Ġfunction , Ġit 's Ġnew Ġname , Ġand Ġthe Ġins ns Ġsaved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmod . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuncs Ġ= Ġmod . funcs . to Mutable List (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ actual Fn Index ] Ġ= Ġfunc . copy ( instructions Ġ= Ġnew Ins ns ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ+ Ġpattern . new Func , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnames Ġ= Ġmod . names ?. copy ( func Names Ġ= Ġmod . names . func Names . to Mutable Map (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ new Func Index ] Ġ= ĠnewName !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġto Ġpattern . ins ns Saved ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠResults Ġare Ġby Ġmost Ġins ns Ġsaved . ĠThere Ġcan Ġbe Ġoverlap Ġacross Ġpatterns Ġbut Ġnever Ġwithin Ġa Ġsingle Ġpattern . ĊĠĠĠ Ġfun Ġcommon Patterns ( mod : ĠNode . Module , Ġfn : ĠNode . Func ): ĠList < Common Pattern > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWalk Ġthe Ġstack Ġfor Ġvalidation Ġneeds ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= ĠStack . walk Strict ( mod , Ġfn ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLet 's Ġgrab Ġsets Ġof Ġins ns Ġthat Ġqual ify . ĠIn Ġthis Ġna ive Ġimpl , Ġin Ġorder Ġto Ġqual ify Ġthe Ġinsn Ġset Ġneeds Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġhave Ġa Ġcertain Ġset Ġof Ġins ns Ġthat Ġcan Ġbe Ġbroken Ġoff . ĠIt Ġcan Ġalso Ġonly Ġchange Ġthe Ġstack Ġby Ġ 0 Ġor Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// Ġvalue Ġwhile Ġnever Ġdi pping Ġbelow Ġthe Ġstarting Ġstack . ĠWe Ġalso Ġstore Ġthe Ġindex Ġthey Ġstarted Ġat . ĊĠĠĠĠĠĠĠ Ġvar Ġinsn Sets Ġ= Ġempty List < Insn Set >() ĊĠĠĠĠĠĠĠ Ġ// ĠPair Ġin Ġfold Ġkey ed Ġby Ġinsn Ġindex ĊĠĠĠĠĠĠĠ Ġfn . instructions . fold Indexed ( null Ġas ĠList < Pair < Int , ĠNode . Instr >> ?) Ġ{ Ġindex , Ġlast Ins ns , Ġinsn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! insn . can Be Moved ) Ġnull Ġelse Ġ( last Ins ns Ġ?: Ġempty List ()). plus ( index Ġto Ġinsn ). also Ġ{ Ġfull New Insn Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġfinal Ġinstructions Ġbetween Ġmin Ġand Ġmax Ġsize Ġand Ġwith Ġallowed Ġparam Ġcount Ġ( i . e . Ġconst Ġcount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrailing Insn Set Ġ= Ġfull New Insn Set . take Last ( max Set Length ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġall Ġinstructions Ġbetween Ġthe Ġmin Ġand Ġmax ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Sets Ġ+= Ġ( min Set Length .. max Set Length ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas Sequence (). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflat Map Ġ{ Ġtrailing Insn Set . as Sequence (). window ed ( it ) Ġ}. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ{ Ġit . count Ġ{ Ġit . second Ġis ĠNode . Instr . Args . Const < *> Ġ} Ġ<= Ġmax Param Count Ġ}. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap NotNull Ġ{ Ġnew Indexed Insn Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBefore Ġadding , Ġmake Ġsure Ġit Ġqual ifies Ġwith Ġthe Ġstack ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn sn Set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex Ġ= Ġnew Indexed Insn Set . first (). first , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġins ns Ġ= Ġnew Indexed Insn Set . map Ġ{ Ġit . second Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Added To Stack Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). with Stack Value If Valid ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠSort Ġthe Ġinsn Ġsets Ġby Ġthe Ġones Ġwith Ġthe Ġmost Ġins ns ĊĠĠĠĠĠĠĠ Ġinsn Sets Ġ= Ġinsn Sets . sorted By Descending Ġ{ Ġit . ins ns . size Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġlet 's Ġcreate Ġreplacement s Ġfor Ġeach , Ġkey ed Ġby Ġthe Ġextracted Ġfunc ĊĠĠĠĠĠĠĠ Ġval Ġpatterns Ġ= Ġinsn Sets . fold ( empty Map < Node . Func , ĠList < Replacement >> ()) Ġ{ Ġmap , Ġinsn Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsn Set . extract Common Func (). let Ġ{ Ġ( func , Ġreplacement ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Replacement s Ġ= Ġmap . get OrDefault ( func , Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġif Ġthere Ġis Ġany Ġoverlap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing Replacement s . any ( replacement :: overlap s )) Ġmap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġmap Ġ+ Ġ( func Ġto Ġexisting Replacement s . plus ( replacement )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġsort Ġthe Ġpatterns Ġby Ġmost Ġins ns Ġsaved Ġand Ġreturn ĊĠĠĠĠĠĠĠ Ġreturn Ġpatterns . map Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommon Pattern ( k , Ġv . sorted By Ġ{ Ġit . range . first Ġ}) ĊĠĠĠĠĠĠĠ Ġ}. sorted By Descending Ġ{ Ġit . ins ns Saved Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠNode . Instr . can Be Moved Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġblocks ĊĠĠĠĠĠĠĠ Ġthis Ġ! is ĠNode . Instr . Block Ġ&& Ġthis Ġ! is ĠNode . Instr . Loop Ġ&& Ġthis Ġ! is ĠNode . Instr . If Ġ&& ĊĠĠĠĠĠĠĠ Ġthis Ġ! is ĠNode . Instr . Else Ġ&& Ġthis Ġ! is ĠNode . Instr . End Ġ&& ĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġbreaks ĊĠĠĠĠĠĠĠ Ġthis Ġ! is ĠNode . Instr . Br Ġ&& Ġthis Ġ! is ĠNode . Instr . Br If Ġ&& Ġthis Ġ! is ĠNode . Instr . Br Table Ġ&& ĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġreturn ĊĠĠĠĠĠĠĠ Ġthis Ġ! is ĠNode . Instr . Return Ġ&& ĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġlocal Ġaccess ĊĠĠĠĠĠĠĠ Ġthis Ġ! is ĠNode . Instr . Get Local Ġ&& Ġthis Ġ! is ĠNode . Instr . Set Local Ġ&& Ġthis Ġ! is ĠNode . Instr . T ee Local ĊĊĠĠĠ Ġfun ĠIn sn Set . with Stack Value If Valid ( stack : ĠStack ): ĠIn sn Set ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġmakes Ġsure Ġthat Ġthe Ġstack Ġonly Ġchanges Ġby Ġat Ġmost Ġone Ġitem Ġand Ġnever Ġd ips Ġbelow Ġits Ġstarting Ġval . ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġit Ġis Ġinvalid , Ġnull Ġis Ġreturned . ĠIf Ġit Ġqual ifies Ġand Ġdoes Ġchange Ġ 1 Ġvalue , Ġit Ġis Ġset . ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst , Ġmake Ġsure Ġthe Ġstack Ġafter Ġthe Ġlast Ġinsn Ġis Ġthe Ġsame Ġas Ġthe Ġfirst Ġor Ġthe Ġsame Ġ+ Ġ 1 Ġval ĊĠĠĠĠĠĠĠ Ġval Ġstarting Stack Ġ= Ġstack . insn App lies [ startIndex ]. stack At Beginning !! ĊĠĠĠĠĠĠĠ Ġval Ġending Stack Ġ= Ġstack . insn App lies . get OrNull ( startIndex Ġ+ Ġins ns . size )?. stack At Beginning Ġ?: Ġstack . current !! ĊĠĠĠĠĠĠĠ Ġif Ġ( ending Stack . size Ġ!= Ġstarting Stack . size Ġ&& Ġending Stack . size Ġ!= Ġstarting Stack . size Ġ+ Ġ 1 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( ending Stack . take ( starting Stack . size ) Ġ!= Ġstarting Stack ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow , Ġwalk Ġthe Ġins ns Ġand Ġmake Ġsure Ġthey Ġnever Ġpop Ġbelow Ġthe Ġstart ĊĠĠĠĠĠĠĠ Ġvar Ġstack Counter Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġstack . insn App lies . sub List ( startIndex , ĠstartIndex Ġ+ Ġins ns . size ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stack Changes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack Counter Ġ+= Ġif Ġ( it . pop ) Ġ- 1 Ġelse Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack Counter Ġ< Ġ 0 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠWe 're Ġgood , Ġnow Ġonly Ġif Ġthe Ġending Ġstack Ġis Ġone Ġover Ġthe Ġstart Ġdo Ġwe Ġhave Ġa Ġret Ġval ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Added To Stack Ġ= Ġending Stack . last OrNull ()?. take If Ġ{ Ġending Stack . size Ġ== Ġstarting Stack . size Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠIn sn Set . extract Common Func () Ġ= ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġextract s Ġa Ġfunction Ġwith Ġconstants Ġchanged Ġto Ġparameters ĊĠĠĠĠĠĠĠ Ġins ns . fold ( Pair ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode . Func ( Node . Type . Func ( params Ġ= Ġempty List (), Ġret Ġ= Ġvalue Added To Stack ), Ġempty List (), Ġempty List ()), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRe placement ( range Ġ= ĠstartIndex Ġuntil ĠstartIndex Ġ+ Ġins ns . size , Ġpre Call Consts Ġ= Ġempty List ())) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġ( func , Ġrepl ), Ġinsn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( insn Ġ! is ĠNode . Instr . Args . Const <* >) Ġfunc . copy ( instructions Ġ= Ġfunc . instructions Ġ+ Ġinsn ) Ġto Ġrepl ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġfunc . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġfunc . type . copy ( params Ġ= Ġfunc . type . params Ġ+ Ġinsn . const Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstructions Ġ= Ġfunc . instructions Ġ+ ĠNode . Instr . Get Local ( func . type . params . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġto Ġrepl . copy ( pre Call Consts Ġ= Ġrepl . pre Call Consts Ġ+ Ġinsn ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval ĠNode . Instr . Args . Const <* >. const Type Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 3 2 Const Ġ-> ĠNode . Type . Value . I 3 2 ĊĠĠĠĠĠĠĠ Ġis ĠNode . Instr . I 6 4 Const Ġ-> ĠNode . Type . Value . I 6 4 ĊĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 3 2 Const Ġ-> ĠNode . Type . Value . F 3 2 ĊĠĠĠĠĠĠĠ Ġis ĠNode . Instr . F 6 4 Const Ġ-> ĠNode . Type . Value . F 6 4 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" unreachable ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠIn sn Set ( ĊĠĠĠĠĠĠĠ Ġval ĠstartIndex : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġins ns : ĠList < Node . Instr >, ĊĠĠĠĠĠĠĠ Ġval Ġvalue Added To Stack : ĠNode . Type . Value ? ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠRe placement ( ĊĠĠĠĠĠĠĠ Ġval Ġrange : ĠInt Range , ĊĠĠĠĠĠĠĠ Ġval Ġpre Call Consts : ĠList < Node . Instr > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSubtract Ġone Ġbecause Ġthere Ġis Ġa Ġcall Ġafter Ġthis ĊĠĠĠĠĠĠĠ Ġval Ġins ns Saved Ġget () Ġ= Ġ( range . last Ġ+ Ġ 1 ) Ġ- Ġrange . first Ġ- Ġ 1 Ġ- Ġpre Call Consts . size ĊĠĠĠĠĠĠĠ Ġfun Ġoverlap s ( o : ĠRe placement ) Ġ= Ġrange . contains ( o . range . first ) Ġ|| Ġrange . contains ( o . range . last ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo . range . contains ( range . first ) Ġ|| Ġo . range . contains ( range . last ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCommon Pattern ( ĊĠĠĠĠĠĠĠ Ġval Ġnew Func : ĠNode . Func , ĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġorder Ġby Ġear liest Ġreplacement Ġfirst ĊĠĠĠĠĠĠĠ Ġval Ġreplacement s : ĠList < Replacement > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRe placement Ġpieces Ġsaved Ġ( with Ġone Ġadded Ġfor Ġthe Ġinvocation ) Ġless Ġnew Ġfunc Ġinstructions ĊĠĠĠĠĠĠĠ Ġval Ġins ns Saved Ġget () Ġ= Ġreplacement s . sum By Ġ{ Ġit . ins ns Saved Ġ} Ġ- Ġnew Func . instructions . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠSplit Large Func () Ċ }