package Ġorg . vor pal . research . k ex . e volution s Ċ Ċ import Ġorg . vor pal . research . k fg . Class Manager Ċ import Ġorg . vor pal . research . k fg . ir . Method Ċ import Ġorg . vor pal . research . k fg . ir . value .* Ċ import Ġorg . vor pal . research . k fg . ir . value . instruction .* Ċ import Ġorg . vor pal . research . k fg . visitor . Loop Ċ import Ġorg . vor pal . research . k fg . visitor . Method Visitor Ċ import Ġru . spb stu .* Ċ import Ġru . spb stu . wheel s . map ToArray Ċ Ċ /** Ċ Ġ* ĠEvalu ates Ġevolution s Ġin Ġgiven Ġsymbolic Ġexpression . Ċ Ġ* Ġ@ param Ġs Ġgiven Ġsymbolic Ġexpression . Ċ Ġ* Ġ@ param Ġiterations Ġmap Ġfrom Ġloop Ġto Ġits Ġin duction Ġvariable . Ċ Ġ*/ Ċ fun Ġevaluate E volution s ( s : ĠS ymbolic , Ġiterations : ĠMutable Map < Loop , ĠVar >): ĠS ymbolic Ġ= Ġs . transform Ġ{ Ġsym Ġ-> ĊĠĠĠ Ġwhen Ġ( sym ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠE volution Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl hv Ġ= Ġtransform ( sym . lh v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr hv Ġ= Ġtransform ( sym . rh v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġiterations . get Or Put ( sym . loop , Ġdefault Var ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( sym . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE vo Opcode . PLUS Ġ-> Ġl hv Ġ+ ĠRow Sum . of ( variable , ĠConst ( 1 ), Ġvariable , Ġr hv ) Ġ- Ġr hv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE vo Opcode . TIMES Ġ-> Ġl hv Ġ* ĠRow Product . of ( variable , ĠConst ( 1 ), Ġvariable , Ġr hv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġtransform ( sym ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġdefault Var (): Ġ() Ġ-> ĠVar Ġ= Ġ{ ĠVar . fresh (" iteration ") Ġ} ĊĊ Ċ /** Ċ Ġ* ĠChecks Ġif Ġsymbolic Ġexpression Ġcontains Ġgiven Ġvariable . Ċ Ġ* Ġ@ param Ġv Ġgiven Ġvariable . Ċ Ġ*/ Ċ fun ĠS ymbolic . has Var ( v : ĠVar ): ĠBoolean Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠConst Ġ-> Ġfalse ĊĠĠĠ Ġis ĠVar Ġ-> Ġv Ġ== Ġthis ĊĠĠĠ Ġis ĠApply Ġ-> Ġarguments . any Ġ{ Ġit . has Var ( v ) Ġ} ĊĠĠĠ Ġis ĠProduct Ġ-> Ġparts . any Ġ{ Ġit . key . has Var ( v ) Ġ} ĊĠĠĠ Ġis ĠSum Ġ-> Ġparts . any Ġ{ Ġit . key . has Var ( v ) Ġ} Ċ } Ċ Ċ fun ĠS ymbolic . transform ( body : ĠTransform Scope .( Symbolic ) Ġ-> ĠS ymbolic ): ĠS ymbolic Ġ{ ĊĠĠĠ Ġreturn ĠTransform Scope ( body ). body ( this ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġre ci pro cal Ġof Ġsymbolic Ġexpression . Ċ Ġ*/ Ċ fun ĠS ymbolic . reci pro cal (): ĠS ymbolic Ġ{ ĊĠĠĠ Ġreturn ĠConst ( 1 ) Ġ/ Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠBreak s Ġsum Ġin Ġtwo Ġparts Ġusing Ġgiven Ġpredicate . Ċ Ġ*/ Ċ inline Ġfun ĠSum . partition ( predicate : Ġ( Symbolic ) Ġ-> ĠBoolean ): ĠPair < Symbolic , ĠS ymbolic > Ġ{ ĊĠĠĠ Ġval Ġ( c 1 , Ġc 2 ) Ġ= Ġthis . parts . partition To ( mutable Map Of (), Ġmutable Map Of ()) Ġ{ Ġk , Ġ_ Ġ-> Ġpredicate ( k ) Ġ} ĊĠĠĠ Ġreturn ĠSum ( parts Ġ= Ġc 1 ). simplify () Ġto ĠSum ( parts Ġ= Ġc 2 , Ġconstant Ġ= Ġthis . constant ). simplify () Ċ } Ċ Ċ class ĠTransform Scope ( val Ġbody : ĠTransform Scope .( Symbolic ) Ġ-> ĠS ymbolic ) Ġ{ ĊĠĠĠ Ġfun Ġtransform ( s : ĠS ymbolic ): ĠS ymbolic Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConst , Ġis ĠVar Ġ-> Ġs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠApply Ġ-> Ġs . copy ( arguments Ġ= Ġs . arguments . map Ġ{ Ġbody ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProduct Ġ-> ĠProduct . of ( Const ( s . constant ), Ġ* s . parts . map ToArray Ġ{ Ġ( s , Ġc ) Ġ-> Ġbody ( s ) Ġpow Ġc Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSum Ġ-> ĠSum . of ( Const ( s . constant ), Ġ* s . parts . map ToArray Ġ{ Ġ( s , Ġc ) Ġ-> Ġbody ( s ) Ġ* Ġc Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠVisitor Ġthat Ġperforms Ġevaluation Ġof Ġall Ġevolution s Ġin ĠCFG . Ċ Ġ*/ Ċ open Ġclass ĠE volution s ( override Ġval Ġcm : ĠClass Manager ) Ġ: ĠMethod Visitor Ġ{ ĊĠĠĠ Ġprotected Ġval Ġinst 2 loop Ġ= Ġmutable Map Of < Instruction , ĠLoop >() ĊĠĠĠ Ġprotected Ġval Ġloop Ph is Ġ= Ġmutable Map Of < Phi Inst , ĠLoop >() ĊĠĠĠ Ġprotected Ġval Ġinst 2 var Ġ= Ġmutable Map Of < Value , ĠVar >() ĊĠĠĠ Ġprotected Ġval Ġvar 2 inst Ġ= Ġmutable Map Of < Var , ĠValue >() ĊĊĠĠĠ Ġprivate Ġval ĠPhi Inst . loop Ġget () Ġ= Ġloop Ph is . getValue ( this ) ĊĠĠĠ Ġprivate Ġval ĠPhi Inst . loop Value Ġget () Ġ= Ġthis . in com ings . getValue ( this . loop . latch ) ĊĠĠĠ Ġprivate Ġval ĠPhi Inst . base Value Ġget () Ġ= Ġthis . in com ings . getValue ( this . loop . pre header ) ĊĊĊĠĠĠ Ġprivate Ġoperator Ġfun ĠLoop . contains ( inst : ĠInstruction ) Ġ= Ġinst . parent Ġin Ġthis ĊĊĠĠĠ Ġprivate Ġval Ġequations Ġ= Ġmutable Map Of < Value , ĠS ymbolic ?> () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrans forms Ġgiven Ġvalue Ġto Ġits Ġsymbolic Ġform . ĊĠĠĠĠ Ġ* ĠUsing Ġcache Ġto Ġavoid Ġunnecessary Ġevalu ations . ĊĠĠĠĠ Ġ* ĠCorre spon ds Ġto ĠAn alyze E volution Ġfrom Ġthe Ġpaper . ĊĠĠĠĠ Ġ* Ġ@ param Ġv Ġgiven Ġvalue . ĊĠĠĠĠ Ġ* Ġ@ return Ġsymbolic Ġrepresentation Ġof Ġthe Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġtransform ( v : ĠValue ): ĠS ymbolic Ġ= Ġwhen Ġ( v ) Ġ{ ĊĠĠĠĠĠĠĠ Ġin Ġequations Ġ-> Ġequations [ v ] !! ĊĠĠĠĠĠĠĠ Ġis ĠInt Constant Ġ-> ĠConst ( v . value ) ĊĠĠĠĠĠĠĠ Ġis ĠLong Constant Ġ-> ĠConst ( v . value ) ĊĠĠĠĠĠĠĠ Ġis ĠShort Constant Ġ-> ĠConst ( v . value . toInt ()) ĊĠĠĠĠĠĠĠ Ġis ĠByte Constant Ġ-> ĠConst ( v . value . toInt ()) ĊĠĠĠĠĠĠĠ Ġis ĠUnary Inst Ġ-> Ġv . opcode . to Func (). invoke ( transform ( v . operand )) ĊĠĠĠĠĠĠĠ Ġis ĠBinary Inst Ġ-> Ġv . opcode . to Func (). invoke ( transform ( v . lh v ), Ġtransform ( v . rh v )) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . is Name Defined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠVar ( v . name . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar 2 inst [ res ] Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinst 2 var [ v ] Ġ= Ġres ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠUndefined ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. also Ġ{ Ġequations [ v ] Ġ= Ġit Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġphi Equ ations : ĠMutable Map < Phi Inst , ĠS ymbolic > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġevolution Ġfor Ġgiven Ġphi Ġinstance . ĊĠĠĠĠ Ġ* ĠUses Ġcaching Ġto Ġavoid Ġunnecessary Ġre calcul ations . ĊĠĠĠĠ Ġ* Ġ@ param Ġv Ġgiven Ġphi Ġinstance . ĊĠĠĠĠ Ġ* Ġ@ return Ġsymbolic Ġformula Ġrepresenting Ġevolution Ġof Ġgiven Ġphi Ġin Ġthe Ġloop . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġbuild Phi Equation ( v : ĠPhi Inst ): ĠS ymbolic Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġin Ġphi Equ ations ) Ġreturn Ġphi Equ ations [ v ] !! ĊĠĠĠĠĠĠĠ Ġphi Equ ations [ v ] Ġ= ĠUndefined ĊĠĠĠĠĠĠĠ Ġphi Equ ations [ v ] Ġ= Ġbuild Phi Equation Un cached ( v ) ĊĠĠĠĠĠĠĠ Ġreturn Ġphi Equ ations [ v ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġdepth - first Ġsearch Ġon ĠCFG Ġgraph Ġfrom Ġgiven Ġphi Ġinstance , ĊĠĠĠĠ Ġ* Ġsearch Ġstops Ġwhen Ġthis Ġphi Ġinstance Ġmet Ġagain . ĠResult ing Ġpath Ġused ĊĠĠĠĠ Ġ* Ġto Ġcompute Ġrec urrence Ġrelation Ġof Ġphi Ġvariable . ĊĠĠĠĠ Ġ* ĠSome Ġhe ur istics Ġused Ġto Ġsimplify Ġrec urrence Ġrelation Ġand Ġturn Ġit Ġinto ĊĠĠĠĠ Ġ* Ġfunction Ġfrom Ġiteration Ġnumber . ĊĠĠĠĠ Ġ* Ġ@ param Ġv Ġgiven Ġphi Ġinstance . ĊĠĠĠĠ Ġ* Ġ@ return Ġsymbolic Ġrepresentation Ġof Ġrec urrence Ġrelation , Ġpossibly Ġsimplified . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Phi Equation Un cached ( v : ĠPhi Inst ): ĠS ymbolic Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġtransform ( v . base Value ) ĊĠĠĠĠĠĠĠ Ġvar Ġrecur Ġ= Ġtransform ( v . loop Value ) ĊĠĠĠĠĠĠĠ Ġval Ġdeps Ġ= Ġrecur . vars () ĊĠĠĠĠĠĠĠ Ġfor Ġ( dep Ġin Ġdeps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd var Ġ= Ġvar 2 inst [ dep ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d var Ġ!= Ġv Ġ&& Ġd var Ġis ĠPhi Inst Ġ&& Ġd var Ġin Ġloop Ph is Ġ&& Ġd var . loop Ġ== Ġv . loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecur Ġ= Ġrecur . subst ( dep Ġto Ġbuild Phi Equation ( d var )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġme Ġ= Ġtransform ( v ) Ġas ĠVar ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( recur ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠConst , Ġis ĠVar Ġ-> Ġreturn Ġrecur ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShift Left Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( lh v , Ġr hv ) Ġ= Ġrecur . arguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lh v Ġ!= Ġme ) Ġreturn ĠUndefined ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠShift Left ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE volution ( v . loop , ĠE vo Opcode . PLUS , ĠConst . ZERO , Ġr hv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShift Right Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( lh v , Ġr hv ) Ġ= Ġrecur . arguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lh v Ġ!= Ġme ) Ġreturn ĠUndefined ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠShift Right ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE volution ( v . loop , ĠE vo Opcode . PLUS , ĠConst . ZERO , Ġr hv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK F GB inary Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( lh v , Ġr hv ) Ġ= Ġrecur . arguments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lh v Ġ!= Ġme ) Ġreturn ĠUndefined ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( recur . opcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Opcode . DIV Ġ-> ĠK F GB inary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Opcode . DIV , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE volution ( v . loop , ĠE vo Opcode . TIMES , ĠConst . ONE , Ġr hv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBinary Opcode . US HR Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK F GB inary ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecur . opcode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE volution ( v . loop , ĠE vo Opcode . PLUS , ĠConst . ZERO , Ġr hv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUndefined ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠApply Ġ-> Ġreturn Ġrecur ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProduct Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġde compose Ġrecur Ġto Ġ( Alpha Ġ* Ġme ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha Ġ= Ġrecur Ġ/ Ġme ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alpha . has Var ( me )) Ġreturn ĠUndefined ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠE volution ( v . loop , ĠE vo Opcode . TIMES , Ġbase , Ġalpha ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSum Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġde compose Ġrecur Ġto Ġ( Alpha Ġ* Ġme Ġ+ ĠBeta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( l , Ġbeta ) Ġ= Ġrecur . partition Ġ{ Ġit . has Var ( me ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalpha Ġ= Ġl Ġ/ Ġme ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alpha . has Var ( me )) Ġreturn ĠUndefined ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ== ĠConst . ONE Ġ-> ĠE volution ( v . loop , ĠE vo Opcode . PLUS , Ġbase , Ġbeta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbeta Ġ== ĠConst . ZERO Ġ-> ĠE volution ( v . loop , ĠE vo Opcode . TIMES , Ġbase , Ġalpha ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ== ĠConst . ZERO Ġ-> ĠE volution ( v . loop , ĠE vo Opcode . PLUS , ĠConst . ZERO , Ġbeta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠE volution ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . loop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE vo Opcode . TIMES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE volution ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . loop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE vo Opcode . PLUS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE volution ( v . loop , ĠE vo Opcode . TIMES , Ġbeta , Ġalpha . reci pro cal ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcleanup () Ġ{} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠCollect s Ġall Ġloops Ġin Ġthe Ġmethod . Ċ Ġ* Ġ@ param Ġmethod Ġgiven Ġmethod . Ċ Ġ* Ġ@ return Ġsequence Ġof Ġall Ġloops Ġin Ġthe Ġmethod . Ċ Ġ*/ Ċ fun Ġwalk Lo ops ( top Level : ĠList < Loop >) Ġ= Ġsequence Ġ{ ĊĠĠĠ Ġfor Ġ( loop Ġin Ġtop Level ) Ġyield All ( walk Lo ops ( loop )) Ċ } Ċ Ċ /** Ċ Ġ* ĠRe cursively Ġcollect s Ġall Ġsub - loops Ġin Ġthe Ġgiven Ġloop . Ċ Ġ* Ġ@ param Ġtop Ġgiven Ġtop Ġloop . Ċ Ġ* Ġ@ return Ġsequence Ġof Ġall Ġsub - loops Ġof Ġthe Ġtop Ġloop Ġincluding Ġtop Ġloop Ġitself Ġcollected Ġrecursively . Ċ Ġ*/ Ċ fun Ġwalk Lo ops ( top : ĠLoop ): ĠSequence < Loop > Ġ= Ġsequence Ġ{ ĊĠĠĠ Ġfor Ġ( loop Ġin Ġtop . sub Lo ops ) Ġ{ ĊĠĠĠĠĠĠĠ Ġyield All ( walk Lo ops ( loop )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġyield ( top ) Ċ }