module SSA (Locality (..), Var (..), VarList, Label, VarOrImm (..), SSA (..)) where
import AST (ArithOp, AssignOp, CondOp, EqOp, NegOp, NotOp, RelOp, Type)
import AST qualified
import Control.Lens (use, uses, view, (%=), (%~), (&), (+=), (.=), (.~), (^.), _1, _2, _3)
import Control.Monad.State
import Data.Generics.Labels
import Data.Int (Int64)
import Data.Text (Text)
import Data.Text qualified as Text
import Formatting
import GHC.Generics (Generic)
import Types
import Util.SourceLoc qualified as SL
data Locality
= Global
| Local
data Var = Var
{ Var -> VID
id :: !VID,
Var -> Type
tpe :: !Type,
Var -> Maybe (Either Argument FieldDecl)
astDecl :: !(Maybe (Either AST.Argument AST.FieldDecl)),
Var -> Range
loc :: !SL.Range,
Var -> Locality
locality :: !Locality
}
deriving ((forall x. Var -> Rep Var x)
-> (forall x. Rep Var x -> Var) -> Generic Var
forall x. Rep Var x -> Var
forall x. Var -> Rep Var x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Var -> Rep Var x
from :: forall x. Var -> Rep Var x
$cto :: forall x. Rep Var x -> Var
to :: forall x. Rep Var x -> Var
Generic)
type VarList = [Var]
type Label = Text
instance Show Var where
show :: Var -> String
show var :: Var
var@Var {$sel:id:Var :: Var -> VID
id = VID
id} = Format String (VID -> String) -> VID -> String
forall a. Format String a -> a
formatToString (Format (VID -> String) (VID -> String)
"v" Format (VID -> String) (VID -> String)
-> Format String (VID -> String) -> Format String (VID -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (VID -> String)
forall a r. Integral a => Format r (a -> r)
int) VID
id
data VarOrImm
= BoolImm !Bool
| IntImm !Int64
| CharImm !Char
| StringImm !Text
| PtrImm !Int64
| Variable !Var
escapeChar :: Char -> Text
escapeChar :: Char -> Text
escapeChar = \case
Char
'\\' -> Text
"\\\\\\\\"
Char
'\n' -> Text
"\\\\n"
Char
'\t' -> Text
"\\\\t"
Char
'\'' -> Text
"\\\'"
Char
'"' -> Text
"\\\\\\\""
Char
'\0' -> Text
"\\\\0"
Char
c -> Char -> Text
Text.singleton Char
c
escape :: Text -> Text
escape :: Text -> Text
escape = (Char -> Text) -> Text -> Text
Text.concatMap Char -> Text
escapeChar
instance Show VarOrImm where
show :: VarOrImm -> String
show (BoolImm Bool
True) = String
"true"
show (BoolImm Bool
False) = String
"false"
show (IntImm Int64
val) = Format String (Int64 -> String) -> Int64 -> String
forall a. Format String a -> a
formatToString Format String (Int64 -> String)
forall a r. Integral a => Format r (a -> r)
int Int64
val
show (CharImm Char
val) = Format String (Text -> String) -> Text -> String
forall a. Format String a -> a
formatToString (Format (Text -> String) (Text -> String)
"'" Format (Text -> String) (Text -> String)
-> Format String (Text -> String) -> Format String (Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Text -> String)
forall r. Format r (Text -> r)
stext Format String (Text -> String)
-> Format String String -> Format String (Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
"'") (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ Char -> Text
escapeChar Char
val
show (PtrImm Int64
val) = Format String (Int64 -> String) -> Int64 -> String
forall a. Format String a -> a
formatToString Format String (Int64 -> String)
forall a r. Integral a => Format r (a -> r)
prefixHex Int64
val
show (StringImm Text
val) = Format String (Text -> String) -> Text -> String
forall a. Format String a -> a
formatToString (Format (Text -> String) (Text -> String)
"\\\"" Format (Text -> String) (Text -> String)
-> Format String (Text -> String) -> Format String (Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Text -> String)
forall r. Format r (Text -> r)
stext Format String (Text -> String)
-> Format String String -> Format String (Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
"\\\"") (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ Text -> Text
escape Text
val
show (Variable Var {$sel:id:Var :: Var -> VID
id = VID
id}) = Format String (VID -> String) -> VID -> String
forall a. Format String a -> a
formatToString (Format (VID -> String) (VID -> String)
"v" Format (VID -> String) (VID -> String)
-> Format String (VID -> String) -> Format String (VID -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (VID -> String)
forall a r. Integral a => Format r (a -> r)
int) VID
id
data SSA
= Assignment {SSA -> Var
dst :: !Var, SSA -> VarOrImm
src :: !VarOrImm}
| MethodCall {dst :: !Var, SSA -> Text
name :: !Name, SSA -> [Var]
arguments :: ![Var]}
| Return {SSA -> Maybe VarOrImm
ret :: !(Maybe VarOrImm)}
| Alloca {dst :: !Var, SSA -> Type
tpe :: !AST.Type, SSA -> Maybe Int64
sz :: !(Maybe Int64)}
| Load {dst :: !Var, SSA -> VarOrImm
ptr :: !VarOrImm}
| Store {ptr :: !VarOrImm, src :: !VarOrImm}
| Arith {dst :: !Var, SSA -> ArithOp
arithOp :: !ArithOp, SSA -> VarOrImm
opl :: !VarOrImm, SSA -> VarOrImm
opr :: !VarOrImm}
| Rel {dst :: !Var, SSA -> RelOp
relOp :: !RelOp, opl :: !VarOrImm, opr :: !VarOrImm}
| Cond {dst :: !Var, SSA -> CondOp
condOp :: !CondOp, opl :: !VarOrImm, opr :: !VarOrImm}
| Eq {dst :: !Var, SSA -> EqOp
eqOp :: !EqOp, opl :: !VarOrImm, opr :: !VarOrImm}
| Neg {dst :: !Var, SSA -> NegOp
negOp :: !NegOp, SSA -> VarOrImm
oprand :: !VarOrImm}
| Not {dst :: !Var, SSA -> NotOp
notOp :: !NotOp, oprand :: !VarOrImm}
| Phi {dst :: !Var, SSA -> [(Var, VID)]
predecessors :: ![(Var, BBID)]}
| AllocaStr {dst :: !Var, SSA -> Text
content :: !Text, tpe :: !AST.Type}
| BrUncon {SSA -> Text
target :: !Label}
| BrCon {SSA -> VarOrImm
pred :: !VarOrImm, SSA -> Text
targetT :: !Label, SSA -> Text
targetF :: !Label}
deriving ((forall x. SSA -> Rep SSA x)
-> (forall x. Rep SSA x -> SSA) -> Generic SSA
forall x. Rep SSA x -> SSA
forall x. SSA -> Rep SSA x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SSA -> Rep SSA x
from :: forall x. SSA -> Rep SSA x
$cto :: forall x. Rep SSA x -> SSA
to :: forall x. Rep SSA x -> SSA
Generic)
ppVarWithType :: Format r (Var -> r)
ppVarWithType :: forall r. Format r (Var -> r)
ppVarWithType = ((Type -> Const Type Type) -> Var -> Const Type Var)
-> Format r (Type -> r) -> Format r (Var -> r)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Type -> Const Type Type) -> Var -> Const Type Var
#tpe Format r (Type -> r)
forall a r. Show a => Format r (a -> r)
shown Format r (Var -> r) -> Format r (Var -> r) -> Format r (Var -> r)
forall r a.
Format r (a -> r) -> Format r (a -> r) -> Format r (a -> r)
<%+> Format r (Var -> r)
forall a r. Show a => Format r (a -> r)
shown
ppVars :: Format r ([Var] -> r)
ppVars :: forall r. Format r ([Var] -> r)
ppVars = Text -> Format Builder (Var -> Builder) -> Format r ([Var] -> r)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " Format Builder (Var -> Builder)
forall a r. Show a => Format r (a -> r)
shown
ppPhiPreds :: Format r ([(Var, BBID)] -> r)
ppPhiPreds :: forall r. Format r ([(Var, VID)] -> r)
ppPhiPreds = Text
-> Format Builder ((Var, VID) -> Builder)
-> Format r ([(Var, VID)] -> r)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " Format Builder ((Var, VID) -> Builder)
forall r. Format r ((Var, VID) -> r)
showPredPair
where
showPredPair :: Format r ((Var, BBID) -> r)
showPredPair :: forall r. Format r ((Var, VID) -> r)
showPredPair = Format ((Var, VID) -> r) ((Var, VID) -> r)
"[" Format ((Var, VID) -> r) ((Var, VID) -> r)
-> Format r ((Var, VID) -> r) -> Format r ((Var, VID) -> r)
forall r a r'. Format r a -> Format r' r -> Format r' a
% ((Var -> Const Var Any) -> (Var, VID) -> Const Var (Any, VID))
-> Format r (Var -> r) -> Format r ((Var, VID) -> r)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Var -> Const Var Any) -> (Var, VID) -> Const Var (Any, VID)
forall s t a b. Field1 s t a b => Lens s t a b
Lens (Var, VID) (Any, VID) Var Any
_1 Format r (Var -> r)
forall a r. Show a => Format r (a -> r)
shown Format r ((Var, VID) -> r)
-> Format r r -> Format r ((Var, VID) -> r)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format r r
", %" Format r ((Var, VID) -> r)
-> Format r ((Var, VID) -> r) -> Format r ((Var, VID) -> r)
forall a. Semigroup a => a -> a -> a
<> ((VID -> Const VID Any) -> (Var, VID) -> Const VID (Var, Any))
-> Format r (VID -> r) -> Format r ((Var, VID) -> r)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (VID -> Const VID Any) -> (Var, VID) -> Const VID (Var, Any)
forall s t a b. Field2 s t a b => Lens s t a b
Lens (Var, VID) (Var, Any) VID Any
_2 Format r (VID -> r)
forall a r. Integral a => Format r (a -> r)
int Format r ((Var, VID) -> r)
-> Format r r -> Format r ((Var, VID) -> r)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format r r
"]"
instance Show SSA where
show :: SSA -> String
show (Assignment Var
dst VarOrImm
src) = Format String (Var -> VarOrImm -> String)
-> Var -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format (VarOrImm -> String) (Var -> VarOrImm -> String)
forall r. Format r (Var -> r)
ppVarWithType Format (VarOrImm -> String) (Var -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (Var -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (VarOrImm -> String)
"=" Format (VarOrImm -> String) (VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst VarOrImm
src
show (MethodCall Var
dst Text
name [Var]
arguments) = Format String (Var -> Text -> [Var] -> String)
-> Var -> Text -> [Var] -> String
forall a. Format String a -> a
formatToString (Format (Text -> [Var] -> String) (Var -> Text -> [Var] -> String)
forall r. Format r (Var -> r)
ppVarWithType Format (Text -> [Var] -> String) (Var -> Text -> [Var] -> String)
-> Format String (Text -> [Var] -> String)
-> Format String (Var -> Text -> [Var] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Text -> [Var] -> String) (Text -> [Var] -> String)
"=" Format (Text -> [Var] -> String) (Text -> [Var] -> String)
-> Format String (Text -> [Var] -> String)
-> Format String (Text -> [Var] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format ([Var] -> String) (Text -> [Var] -> String)
forall r. Format r (Text -> r)
stext Format ([Var] -> String) (Text -> [Var] -> String)
-> Format String ([Var] -> String)
-> Format String (Text -> [Var] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Var] -> String) ([Var] -> String)
"(" Format ([Var] -> String) ([Var] -> String)
-> Format String ([Var] -> String)
-> Format String ([Var] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String ([Var] -> String)
forall r. Format r ([Var] -> r)
ppVars Format String ([Var] -> String)
-> Format String String -> Format String ([Var] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
")") Var
dst Text
name [Var]
arguments
show (Return Maybe VarOrImm
Nothing) = String
"return"
show (Return (Just VarOrImm
val)) = Format String (VarOrImm -> String) -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format (VarOrImm -> String) (VarOrImm -> String)
"return" Format (VarOrImm -> String) (VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) VarOrImm
val
show (Load Var
dst VarOrImm
ptr) = Format String (Var -> VarOrImm -> String)
-> Var -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format (VarOrImm -> String) (Var -> VarOrImm -> String)
forall r. Format r (Var -> r)
ppVarWithType Format (VarOrImm -> String) (Var -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (Var -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (VarOrImm -> String)
"= *" Format (VarOrImm -> String) (VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst VarOrImm
ptr
show (Store VarOrImm
ptr VarOrImm
src) = Format String (VarOrImm -> VarOrImm -> String)
-> VarOrImm -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format
(VarOrImm -> VarOrImm -> String) (VarOrImm -> VarOrImm -> String)
"*" Format
(VarOrImm -> VarOrImm -> String) (VarOrImm -> VarOrImm -> String)
-> Format String (VarOrImm -> VarOrImm -> String)
-> Format String (VarOrImm -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (VarOrImm -> String) (VarOrImm -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format (VarOrImm -> String) (VarOrImm -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (VarOrImm -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (VarOrImm -> String)
"=" Format (VarOrImm -> String) (VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) VarOrImm
ptr VarOrImm
src
show (Alloca Var
dst Type
tpe Maybe Int64
Nothing) = Format String (Var -> Type -> String) -> Var -> Type -> String
forall a. Format String a -> a
formatToString (Format (Type -> String) (Var -> Type -> String)
forall r. Format r (Var -> r)
ppVarWithType Format (Type -> String) (Var -> Type -> String)
-> Format String (Type -> String)
-> Format String (Var -> Type -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> String) (Type -> String)
"= alloca" Format (Type -> String) (Type -> String)
-> Format String (Type -> String) -> Format String (Type -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Type -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst Type
tpe
show (Alloca Var
dst Type
tpe (Just Int64
sz)) = Format String (Var -> Type -> Int64 -> String)
-> Var -> Type -> Int64 -> String
forall a. Format String a -> a
formatToString (Format (Type -> Int64 -> String) (Var -> Type -> Int64 -> String)
forall r. Format r (Var -> r)
ppVarWithType Format (Type -> Int64 -> String) (Var -> Type -> Int64 -> String)
-> Format String (Type -> Int64 -> String)
-> Format String (Var -> Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> Int64 -> String) (Type -> Int64 -> String)
"= alloca" Format (Type -> Int64 -> String) (Type -> Int64 -> String)
-> Format String (Type -> Int64 -> String)
-> Format String (Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Int64 -> String) (Type -> Int64 -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Int64 -> String) (Type -> Int64 -> String)
-> Format String (Int64 -> String)
-> Format String (Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Int64 -> String)
forall a r. Integral a => Format r (a -> r)
int) Var
dst Type
tpe Int64
sz
show (Arith Var
dst ArithOp
op VarOrImm
opl VarOrImm
opr) = Format String (Var -> VarOrImm -> ArithOp -> VarOrImm -> String)
-> Var -> VarOrImm -> ArithOp -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format
(VarOrImm -> ArithOp -> VarOrImm -> String)
(Var -> VarOrImm -> ArithOp -> VarOrImm -> String)
forall r. Format r (Var -> r)
ppVarWithType Format
(VarOrImm -> ArithOp -> VarOrImm -> String)
(Var -> VarOrImm -> ArithOp -> VarOrImm -> String)
-> Format String (VarOrImm -> ArithOp -> VarOrImm -> String)
-> Format String (Var -> VarOrImm -> ArithOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(VarOrImm -> ArithOp -> VarOrImm -> String)
(VarOrImm -> ArithOp -> VarOrImm -> String)
"=" Format
(VarOrImm -> ArithOp -> VarOrImm -> String)
(VarOrImm -> ArithOp -> VarOrImm -> String)
-> Format String (VarOrImm -> ArithOp -> VarOrImm -> String)
-> Format String (VarOrImm -> ArithOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(ArithOp -> VarOrImm -> String)
(VarOrImm -> ArithOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(ArithOp -> VarOrImm -> String)
(VarOrImm -> ArithOp -> VarOrImm -> String)
-> Format String (ArithOp -> VarOrImm -> String)
-> Format String (VarOrImm -> ArithOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (ArithOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format (VarOrImm -> String) (ArithOp -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (ArithOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst VarOrImm
opl ArithOp
op VarOrImm
opr
show (Rel Var
dst RelOp
op VarOrImm
opl VarOrImm
opr) = Format String (Var -> VarOrImm -> RelOp -> VarOrImm -> String)
-> Var -> VarOrImm -> RelOp -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format
(VarOrImm -> RelOp -> VarOrImm -> String)
(Var -> VarOrImm -> RelOp -> VarOrImm -> String)
forall r. Format r (Var -> r)
ppVarWithType Format
(VarOrImm -> RelOp -> VarOrImm -> String)
(Var -> VarOrImm -> RelOp -> VarOrImm -> String)
-> Format String (VarOrImm -> RelOp -> VarOrImm -> String)
-> Format String (Var -> VarOrImm -> RelOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(VarOrImm -> RelOp -> VarOrImm -> String)
(VarOrImm -> RelOp -> VarOrImm -> String)
"=" Format
(VarOrImm -> RelOp -> VarOrImm -> String)
(VarOrImm -> RelOp -> VarOrImm -> String)
-> Format String (VarOrImm -> RelOp -> VarOrImm -> String)
-> Format String (VarOrImm -> RelOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(RelOp -> VarOrImm -> String)
(VarOrImm -> RelOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(RelOp -> VarOrImm -> String)
(VarOrImm -> RelOp -> VarOrImm -> String)
-> Format String (RelOp -> VarOrImm -> String)
-> Format String (VarOrImm -> RelOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (RelOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format (VarOrImm -> String) (RelOp -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (RelOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst VarOrImm
opl RelOp
op VarOrImm
opr
show (Cond Var
dst CondOp
op VarOrImm
opl VarOrImm
opr) = Format String (Var -> VarOrImm -> CondOp -> VarOrImm -> String)
-> Var -> VarOrImm -> CondOp -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format
(VarOrImm -> CondOp -> VarOrImm -> String)
(Var -> VarOrImm -> CondOp -> VarOrImm -> String)
forall r. Format r (Var -> r)
ppVarWithType Format
(VarOrImm -> CondOp -> VarOrImm -> String)
(Var -> VarOrImm -> CondOp -> VarOrImm -> String)
-> Format String (VarOrImm -> CondOp -> VarOrImm -> String)
-> Format String (Var -> VarOrImm -> CondOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(VarOrImm -> CondOp -> VarOrImm -> String)
(VarOrImm -> CondOp -> VarOrImm -> String)
"=" Format
(VarOrImm -> CondOp -> VarOrImm -> String)
(VarOrImm -> CondOp -> VarOrImm -> String)
-> Format String (VarOrImm -> CondOp -> VarOrImm -> String)
-> Format String (VarOrImm -> CondOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(CondOp -> VarOrImm -> String)
(VarOrImm -> CondOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(CondOp -> VarOrImm -> String)
(VarOrImm -> CondOp -> VarOrImm -> String)
-> Format String (CondOp -> VarOrImm -> String)
-> Format String (VarOrImm -> CondOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (CondOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format (VarOrImm -> String) (CondOp -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (CondOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst VarOrImm
opl CondOp
op VarOrImm
opr
show (Eq Var
dst EqOp
op VarOrImm
opl VarOrImm
opr) = Format String (Var -> VarOrImm -> EqOp -> VarOrImm -> String)
-> Var -> VarOrImm -> EqOp -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format
(VarOrImm -> EqOp -> VarOrImm -> String)
(Var -> VarOrImm -> EqOp -> VarOrImm -> String)
forall r. Format r (Var -> r)
ppVarWithType Format
(VarOrImm -> EqOp -> VarOrImm -> String)
(Var -> VarOrImm -> EqOp -> VarOrImm -> String)
-> Format String (VarOrImm -> EqOp -> VarOrImm -> String)
-> Format String (Var -> VarOrImm -> EqOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(VarOrImm -> EqOp -> VarOrImm -> String)
(VarOrImm -> EqOp -> VarOrImm -> String)
"=" Format
(VarOrImm -> EqOp -> VarOrImm -> String)
(VarOrImm -> EqOp -> VarOrImm -> String)
-> Format String (VarOrImm -> EqOp -> VarOrImm -> String)
-> Format String (VarOrImm -> EqOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
(EqOp -> VarOrImm -> String)
(VarOrImm -> EqOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format
(EqOp -> VarOrImm -> String)
(VarOrImm -> EqOp -> VarOrImm -> String)
-> Format String (EqOp -> VarOrImm -> String)
-> Format String (VarOrImm -> EqOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (EqOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format (VarOrImm -> String) (EqOp -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (EqOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst VarOrImm
opl EqOp
op VarOrImm
opr
show (Neg Var
dst NegOp
op VarOrImm
opd) = Format String (Var -> NegOp -> VarOrImm -> String)
-> Var -> NegOp -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format
(NegOp -> VarOrImm -> String) (Var -> NegOp -> VarOrImm -> String)
forall r. Format r (Var -> r)
ppVarWithType Format
(NegOp -> VarOrImm -> String) (Var -> NegOp -> VarOrImm -> String)
-> Format String (NegOp -> VarOrImm -> String)
-> Format String (Var -> NegOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (NegOp -> VarOrImm -> String) (NegOp -> VarOrImm -> String)
"=" Format (NegOp -> VarOrImm -> String) (NegOp -> VarOrImm -> String)
-> Format String (NegOp -> VarOrImm -> String)
-> Format String (NegOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (NegOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format (VarOrImm -> String) (NegOp -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (NegOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst NegOp
op VarOrImm
opd
show (Not Var
dst NotOp
op VarOrImm
opd) = Format String (Var -> NotOp -> VarOrImm -> String)
-> Var -> NotOp -> VarOrImm -> String
forall a. Format String a -> a
formatToString (Format
(NotOp -> VarOrImm -> String) (Var -> NotOp -> VarOrImm -> String)
forall r. Format r (Var -> r)
ppVarWithType Format
(NotOp -> VarOrImm -> String) (Var -> NotOp -> VarOrImm -> String)
-> Format String (NotOp -> VarOrImm -> String)
-> Format String (Var -> NotOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (NotOp -> VarOrImm -> String) (NotOp -> VarOrImm -> String)
"=" Format (NotOp -> VarOrImm -> String) (NotOp -> VarOrImm -> String)
-> Format String (NotOp -> VarOrImm -> String)
-> Format String (NotOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (VarOrImm -> String) (NotOp -> VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown Format (VarOrImm -> String) (NotOp -> VarOrImm -> String)
-> Format String (VarOrImm -> String)
-> Format String (NotOp -> VarOrImm -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (VarOrImm -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
dst NotOp
op VarOrImm
opd
show (Phi Var
dst [(Var, VID)]
preds) = Format String (Var -> [(Var, VID)] -> String)
-> Var -> [(Var, VID)] -> String
forall a. Format String a -> a
formatToString (Format ([(Var, VID)] -> String) (Var -> [(Var, VID)] -> String)
forall r. Format r (Var -> r)
ppVarWithType Format ([(Var, VID)] -> String) (Var -> [(Var, VID)] -> String)
-> Format String ([(Var, VID)] -> String)
-> Format String (Var -> [(Var, VID)] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format ([(Var, VID)] -> String) ([(Var, VID)] -> String)
"= phi" Format ([(Var, VID)] -> String) ([(Var, VID)] -> String)
-> Format String ([(Var, VID)] -> String)
-> Format String ([(Var, VID)] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String ([(Var, VID)] -> String)
forall r. Format r ([(Var, VID)] -> r)
ppPhiPreds) Var
dst [(Var, VID)]
preds
show (AllocaStr Var
dst Text
content Type
tpe) = Format String (Var -> Text -> String) -> Var -> Text -> String
forall a. Format String a -> a
formatToString (Format (Text -> String) (Var -> Text -> String)
forall r. Format r (Var -> r)
ppVarWithType Format (Text -> String) (Var -> Text -> String)
-> Format String (Text -> String)
-> Format String (Var -> Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Text -> String) (Text -> String)
"= string \\\"" Format (Text -> String) (Text -> String)
-> Format String (Text -> String) -> Format String (Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Text -> String)
forall r. Format r (Text -> r)
stext Format String (Text -> String)
-> Format String String -> Format String (Text -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
"\\\"") Var
dst (Text -> Text
escape Text
content)