package Ġk iger . can on Ċ Ċ import Ġk iger . ir . quad . BasicBlock Ċ import Ġk iger . ir . quad . Control Flow Graph Ċ import Ġk iger . ir . quad . Q Exp Ċ import Ġk iger . ir . quad . Quad Ċ import Ġk iger . ir . tree . Tree BasicBlock Ċ import Ġk iger . ir . tree . Tree Control Flow Graph Ċ import Ġk iger . ir . tree . Tree Exp Ċ import Ġk iger . ir . tree . Tree Exp . Temporary Ċ import Ġk iger . ir . tree . Tree St m Ċ Ċ fun ĠControl Flow Graph . to Tree (): ĠTree Control Flow Graph Ġ= ĊĠĠĠ ĠTree Control Flow Graph ( blocks . map Ġ{ Ġit . to Tree () Ġ}, Ġexit Label ) Ċ Ċ fun ĠBasic Block . to Tree (): ĠTree BasicBlock Ġ= ĊĠĠĠ ĠTree BasicBlock ( label , Ġbody . to Tree (), Ġbranch . to Tree () Ġas ĠTree St m . Branch ) Ċ Ċ /** Ċ Ġ* ĠConverts Ġquadr uples Ġto Ġ[ Tree St m ] s . Ċ Ġ* Ċ Ġ* ĠThe Ġconverted Ġtree - statements Ġhave Ġthe Ġsame Ġshallow Ġstructure Ġas Ġthe Ġoriginal Ġqu ads . Ċ Ġ* ĠOne Ġcan Ġuse Ġ[ de linear ize ] Ġto Ġinline Ġtempor aries Ġthat Ġare Ġused Ġonly Ġonce Ġto Ġbuild Ġa Ċ Ġ* Ġtree Ġthat Ġis Ġbetter Ġsuit ed Ġfor Ġinstruction Ġselection . Ċ Ġ* Ċ Ġ* Ġ@ see Ġlinear ize Ċ Ġ*/ Ċ fun ĠList < Quad >. to Tree (): ĠList < Tree St m > Ġ= ĊĠĠĠ Ġmap Ġ{ Ġit . to Tree () Ġ} Ċ Ċ /** Ċ Ġ* ĠConvert Ġ[ Quad ] Ġto Ġcorresponding Ġ[ Tree St m ]. Ċ Ġ*/ Ċ private Ġfun ĠQuad . to Tree (): ĠTree St m Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠQuad . Bin Op ĠĠ Ġ-> ĠTree St m . Move ( Temporary ( target ), ĠTree Exp . Bin Op ( op , Ġlhs . to Tree (), Ġrhs . to Tree ())) ĊĠĠĠ Ġis ĠQuad . Labeled Ġ-> ĠTree St m . Labeled ( label ) ĊĠĠĠ Ġis ĠQuad . Move ĠĠĠ Ġ-> ĠTree St m . Move ( Temporary ( target ), Ġsource . to Tree ()) ĊĠĠĠ Ġis ĠQuad . Jump ĠĠĠ Ġ-> ĠTree St m . Branch . Jump ( target . to Tree (), Ġlabels ) ĊĠĠĠ Ġis ĠQuad . C Jump ĠĠ Ġ-> ĠTree St m . Branch . C Jump ( op , Ġlhs . to Tree (), Ġrhs . to Tree (), Ġtrue Label , Ġfalse Label ) ĊĠĠĠ Ġis ĠQuad . Load ĠĠĠ Ġ-> ĠTree St m . Move ( Temporary ( target ), ĠTree Exp . Mem ( address . to Tree ())) ĊĠĠĠ Ġis ĠQuad . Store ĠĠ Ġ-> ĠTree St m . Move ( Tree Exp . Mem ( address . to Tree ()), Ġvalue . to Tree ()) ĊĠĠĠ Ġis ĠQuad . Call ĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠTree Exp . Call ( func . to Tree (), Ġargs . map Ġ{ Ġit . to Tree () Ġ}) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTree St m . Move ( Temporary ( result ), Ġcall ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTree St m . Exp ( call ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConvert Ġ[ Q Exp ] Ġto Ġcorresponding Ġ[ Tree Exp ]. Ċ Ġ*/ Ċ private Ġfun ĠQ Exp . to Tree (): ĠTree Exp Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠQ Exp . Temporary ĠĠ Ġ-> ĠTree Exp . Temporary ( temp ) ĊĠĠĠ Ġis ĠQ Exp . Const ĠĠĠĠĠĠ Ġ-> ĠTree Exp . Const ( value ) ĊĠĠĠ Ġis ĠQ Exp . Name ĠĠĠĠĠĠĠ Ġ-> ĠTree Exp . Name ( name ) Ċ } Ċ