package Ġorg . jetbrains . research . k ex . state . transformer Ċ Ċ import Ġorg . jetbrains . research . k ex . k type . K ex Pointer Ċ import Ġorg . jetbrains . research . k ex . state . Choice State Ċ import Ġorg . jetbrains . research . k ex . state . Predicate State Ċ import Ġorg . jetbrains . research . k ex . state . predicate . Predicate Ċ import Ġorg . jetbrains . research . k ex . state . predicate . Predicate Type Ċ import Ġorg . jetbrains . research . k ex . state . predicate . has Receiver Ċ import Ġorg . jetbrains . research . k ex . state . predicate . receiver Ċ import Ġorg . jetbrains . research . k ex . state . term . Term Ċ import Ġorg . jetbrains . research . k ex . state . term . is Named Ċ Ċ class ĠCFG Tracker Ġ: ĠTransformer < CFG Tracker > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcurrent Dom in ators Ġ= Ġset Of < Predicate >() ĊĠĠĠ Ġprivate Ġval Ġdom inator Map Ġ= Ġhash Map Of < Predicate , ĠSet < Predicate >>() ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( ps : ĠPredicate State ): ĠPredicate State Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Dom in ators Ġ= Ġset Of () ĊĠĠĠĠĠĠĠ Ġdom inator Map . clear () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . apply ( ps ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Base ( predicate : ĠPredicate ): ĠPredicate Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate . type Ġ== ĠPredicate Type . Path ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dom in ators Ġ= Ġcurrent Dom in ators Ġ+ Ġpredicate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdom inator Map [ predicate ] Ġ= Ġdom inator Map . getOrElse ( predicate , Ġ:: set Of ) Ġ+ Ġcurrent Dom in ators ĊĠĠĠĠĠĠĠ Ġreturn Ġpredicate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Choice ( ps : ĠChoice State ): ĠPredicate State Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentry Dom in ators Ġ= Ġcurrent Dom in ators ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Dom in ators Ġ= Ġcurrent Dom in ators ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( branch Ġin Ġps . choices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Dom in ators Ġ= Ġentry Dom in ators ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform ( branch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Dom in ators Ġ= Ġtotal Dom in ators Ġ+ Ġcurrent Dom in ators ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcurrent Dom in ators Ġ= Ġentry Dom in ators ĊĠĠĠĠĠĠĠ Ġreturn Ġps ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Dom in ating Paths ( predicate : ĠPredicate ) Ġ= Ġdom inator Map . getOrElse ( predicate , Ġ:: set Of ) ĊĠĠĠ Ġval Ġfinal Path Ġget () Ġ= Ġcurrent Dom in ators Ċ } Ċ Ċ class ĠS licer ( val Ġstate : ĠPredicate State , Ġslice Terms : ĠSet < Term >, Ġval Ġaa : ĠAlias Analysis ) Ġ: ĠTransformer < S licer > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġslice Vars Ġ= Ġhash Set Of < Term >() ĊĠĠĠ Ġprivate Ġval Ġslice Ptr s Ġ= Ġhash Set Of < Term >() ĊĠĠĠ Ġprivate Ġval Ġcfg Ġ= ĠCFG Tracker () ĊĠĠĠ Ġvar Ġcurrent Path Ġ= Ġset Of < Predicate >() ĊĊĠĠĠ Ġprivate Ġval Ġis Inter esting Term Ġ= Ġ{ Ġterm : ĠTerm Ġ-> Ġterm . is Named Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġslice Terms . filter ( is Inter esting Term ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Slice Term ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( state : ĠPredicate State , Ġquery : ĠPredicate State , Ġaa : ĠAlias Analysis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġthis ( state , ĠTerm Collector . getFull Term Set ( query ), Ġaa ) ĊĊĠĠĠ Ġconstructor ( state : ĠPredicate State , Ġquery : ĠPredicate State , Ġslice Terms : ĠSet < Term >, Ġaa : ĠAlias Analysis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġthis ( state , ĠTerm Collector . getFull Term Set ( query ) Ġ+ Ġslice Terms , Ġaa ) ĊĊĊĠĠĠ Ġprivate Ġfun Ġadd Slice Term ( term : ĠTerm ) Ġ= Ġwhen Ġ( term . type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK ex Pointer Ġ-> Ġslice Ptr s . add ( term ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġslice Vars . add ( term ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd CFG Deps ( predicate : ĠPredicate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Path Ġ= Ġcfg . get Dom in ating Paths ( predicate ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Vars ( lh v : ĠSet < Term >, Ġr hv : ĠSet < Term >) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġl hv . filter Not Ġ{ Ġit . type Ġis ĠK ex Pointer Ġ}. any Ġ{ Ġslice Vars . contains ( it ) Ġ} Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr hv . forEach Ġ{ Ġadd Slice Term ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Ptr s ( predicate : ĠPredicate , Ġl hv : ĠSet < Term >, Ġr hv : ĠSet < Term >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lh v . isEmpty ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( lh v . filter Ġ{ Ġit . type Ġis ĠK ex Pointer Ġ}. any Ġ{ Ġit Ġin Ġslice Ptr s Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr hv . forEach Ġ{ Ġadd Slice Term ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( predicate . has Receiver ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġl hv Ptr s Ġ= Ġl hv . filter Ġ{ Ġit . type Ġis ĠK ex Pointer Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lh v Ptr s . any Ġ{ Ġref Ġ-> Ġslice Ptr s . any Ġ{ Ġslice Ġ-> Ġaa . may Alias ( ref , Ġslice ) Ġ} Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl hv . forEach Ġ{ Ġadd Slice Term ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr hv . forEach Ġ{ Ġadd Slice Term ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( ps : ĠPredicate State ): ĠPredicate State Ġ{ ĊĠĠĠĠĠĠĠ Ġcfg . apply ( ps ) ĊĠĠĠĠĠĠĠ Ġcurrent Path Ġ= Ġcfg . final Path ĊĊĠĠĠĠĠĠĠ Ġval Ġreversed Ġ= Ġps . reverse () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . apply ( reversed ). reverse (). simplify () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Choice ( ps : ĠChoice State ) Ġ= Ġwhen Ġ( val Ġpsi Ġ= Ġps . simplify ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠChoice State Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved Deps Ġ= Ġcurrent Path ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġpsi . f map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path Ġ= Ġsaved Deps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . transform ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Path Ġ= Ġsaved Deps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . transform Choice ( ps ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Base ( predicate : ĠPredicate ): ĠPredicate Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate . type Ġ== ĠPredicate Type . Ax iom ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpredicate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate . type Ġ== ĠPredicate Type . Path ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd CFG Deps ( predicate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpredicate Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin versed Ġ= Ġpredicate . inverse () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate Ġin Ġcurrent Path Ġ&& Ġin versed Ġ! in Ġcurrent Path Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( op Ġin Ġpredicate . operands ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTerm Collector Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getFull Term Set ( op ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter ( is Inter esting Term ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġadd Slice Term ( it ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd CFG Deps ( predicate ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnothing () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= Ġpredicate . receiver ĊĠĠĠĠĠĠĠ Ġval Ġl hv Terms Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Ġ!= Ġnull Ġ-> ĠTerm Collector . getFull Term Set ( receiver ). filter ( is Inter esting Term ). toSet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġset Of () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġr hv Terms Ġ= Ġpredicate . operands . drop ( 1 ). flatMap Ġ{ ĠTerm Collector . getFull Term Set ( it ) Ġ}. toSet () ĊĊĠĠĠĠĠĠĠ Ġval Ġas Var Ġ= Ġcheck Vars ( lh v Terms , Ġr hv Terms ) ĊĠĠĠĠĠĠĠ Ġval Ġas Ptr Ġ= Ġcheck Ptr s ( predicate , Ġl hv Terms , Ġr hv Terms ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġas Var Ġ|| Ġas Ptr Ġ-> Ġpredicate . also Ġ{ Ġadd CFG Deps ( predicate ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnothing () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }