-- Copyright (C) 2018-2024 Jun Zhang <zhangjunphy[at]gmail[dot]com>
--
-- This file is a part of decafc.
--
-- decafc is free software: you can redistribute it and/or modify it under the
-- terms of the MIT (X11) License as described in the LICENSE file.
--
-- decafc is distributed in the hope that it will be useful, but WITHOUT ANY
-- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE.  See the X11 license for more details.

-- This should be a straightforward translation from CFG into LLVM IR

module CodeGen.LLVMIR where

import Data.Generics.Labels
import Data.Int (Int64)
import Data.Text (Text)
import GHC.Generics (Generic)
import Types (VID, Name)
import Util.SourceLoc qualified as SL
import Formatting
import Control.Lens (use, uses, view, (%=), (%~), (&), (+=), (.=), (.~), (^.), _1, _2, _3)
import qualified Data.Text as Text

newtype Label = Label Int

instance Show Label where
  show :: Label -> String
show (Label Int
t) = Format String (Int -> String) -> Int -> String
forall a. Format String a -> a
formatToString (Format (Int -> String) (Int -> String)
"l" Format (Int -> String) (Int -> String)
-> Format String (Int -> String) -> Format String (Int -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Int -> String)
forall a r. Integral a => Format r (a -> r)
int) Int
t

data Module = Module
  { Module -> [Declare]
declares :: ![Declare],
    Module -> [Global]
globals :: ![Global],
    Module -> [Function]
functions :: ![Function]
  }

instance Show Module where 
  show :: Module -> String
show (Module [Declare]
declares [Global]
globals [Function]
functions) = Format String ([Declare] -> [Global] -> [Function] -> String)
-> [Declare] -> [Global] -> [Function] -> String
forall a. Format String a -> a
formatToString (Text
-> Format Builder (Declare -> Builder)
-> Format
     ([Global] -> [Function] -> String)
     ([Declare] -> [Global] -> [Function] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (Declare -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format
  ([Global] -> [Function] -> String)
  ([Declare] -> [Global] -> [Function] -> String)
-> Format String ([Global] -> [Function] -> String)
-> Format String ([Declare] -> [Global] -> [Function] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format
  ([Global] -> [Function] -> String)
  ([Global] -> [Function] -> String)
"\n" Format
  ([Global] -> [Function] -> String)
  ([Global] -> [Function] -> String)
-> Format String ([Global] -> [Function] -> String)
-> Format String ([Global] -> [Function] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Global -> Builder)
-> Format ([Function] -> String) ([Global] -> [Function] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (Global -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format ([Function] -> String) ([Global] -> [Function] -> String)
-> Format String ([Function] -> String)
-> Format String ([Global] -> [Function] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Function] -> String) ([Function] -> String)
"\n" Format ([Function] -> String) ([Function] -> String)
-> Format String ([Function] -> String)
-> Format String ([Function] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Function -> Builder)
-> Format String ([Function] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (Function -> Builder)
forall a r. Show a => Format r (a -> r)
shown) [Declare]
declares [Global]
globals [Function]
functions

data Global = Global
  { Global -> Text
name :: !Text,
    Global -> Type
tpe :: !Type
  }

instance Show Global where
  show :: Global -> String
show (Global Text
name Type
tpe) = Format String (Text -> Type -> String) -> Text -> Type -> String
forall a. Format String a -> a
formatToString (Format (Text -> Type -> String) (Text -> Type -> String)
"@" Format (Text -> Type -> String) (Text -> Type -> String)
-> Format String (Text -> Type -> String)
-> Format String (Text -> Type -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Type -> String) (Text -> Type -> String)
forall r. Format r (Text -> r)
stext Format (Type -> String) (Text -> Type -> String)
-> Format String (Type -> String)
-> Format String (Text -> Type -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> String) (Type -> String)
"=" 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 (Type -> String) (Type -> String)
"global" 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) Text
name Type
tpe

newtype Declare = Declare 
  { Declare -> Text
name :: Text }

instance Show Declare where
  show :: Declare -> String
show (Declare Text
name) = Format String (Text -> String) -> Text -> String
forall a. Format String a -> a
formatToString (Format (Text -> String) (Text -> String)
"declare void @" 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
name

data Function = Function
  { Function -> Text
name :: !Text,
    Function -> Type
returnType :: !Type,
    Function -> [Argument]
arguments :: ![Argument],
    Function -> [BasicBlock]
basicBlocks :: ![BasicBlock]
  }

instance Show Function where
  show :: Function -> String
show (Function Text
name Type
ret [Argument]
args [BasicBlock]
bbs) =
    Format
  String (Type -> Text -> [Argument] -> [BasicBlock] -> String)
-> Type -> Text -> [Argument] -> [BasicBlock] -> String
forall a. Format String a -> a
formatToString
      (Format
  (Type -> Text -> [Argument] -> [BasicBlock] -> String)
  (Type -> Text -> [Argument] -> [BasicBlock] -> String)
"define" Format
  (Type -> Text -> [Argument] -> [BasicBlock] -> String)
  (Type -> Text -> [Argument] -> [BasicBlock] -> String)
-> Format
     String (Type -> Text -> [Argument] -> [BasicBlock] -> String)
-> Format
     String (Type -> Text -> [Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Text -> [Argument] -> [BasicBlock] -> String)
  (Type -> Text -> [Argument] -> [BasicBlock] -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Text -> [Argument] -> [BasicBlock] -> String)
  (Type -> Text -> [Argument] -> [BasicBlock] -> String)
-> Format String (Text -> [Argument] -> [BasicBlock] -> String)
-> Format
     String (Type -> Text -> [Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Text -> [Argument] -> [BasicBlock] -> String)
  (Text -> [Argument] -> [BasicBlock] -> String)
"@" Format
  (Text -> [Argument] -> [BasicBlock] -> String)
  (Text -> [Argument] -> [BasicBlock] -> String)
-> Format String (Text -> [Argument] -> [BasicBlock] -> String)
-> Format String (Text -> [Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format
  ([Argument] -> [BasicBlock] -> String)
  (Text -> [Argument] -> [BasicBlock] -> String)
forall r. Format r (Text -> r)
stext Format
  ([Argument] -> [BasicBlock] -> String)
  (Text -> [Argument] -> [BasicBlock] -> String)
-> Format String ([Argument] -> [BasicBlock] -> String)
-> Format String (Text -> [Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format
  ([Argument] -> [BasicBlock] -> String)
  ([Argument] -> [BasicBlock] -> String)
"(" Format
  ([Argument] -> [BasicBlock] -> String)
  ([Argument] -> [BasicBlock] -> String)
-> Format String ([Argument] -> [BasicBlock] -> String)
-> Format String ([Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Argument -> Builder)
-> Format
     ([BasicBlock] -> String) ([Argument] -> [BasicBlock] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " Format Builder (Argument -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format
  ([BasicBlock] -> String) ([Argument] -> [BasicBlock] -> String)
-> Format String ([BasicBlock] -> String)
-> Format String ([Argument] -> [BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([BasicBlock] -> String) ([BasicBlock] -> String)
") {\n" Format ([BasicBlock] -> String) ([BasicBlock] -> String)
-> Format String ([BasicBlock] -> String)
-> Format String ([BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (BasicBlock -> Builder)
-> Format String ([BasicBlock] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (BasicBlock -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format String ([BasicBlock] -> String)
-> Format String String -> Format String ([BasicBlock] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
"\n" Format String String
-> Format String String -> Format String String
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
"}")
      Type
ret Text
name [Argument]
args [BasicBlock]
bbs

data Argument = Argument
  { Argument -> Text
name :: !Text,
    Argument -> Type
tpe :: !Type
  }

instance Show Argument where
  show :: Argument -> String
show (Argument Text
name Type
tpe) = Format String (Type -> Text -> String) -> Type -> Text -> String
forall a. Format String a -> a
formatToString (Format (Text -> String) (Type -> Text -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Text -> String) (Type -> Text -> String)
-> Format String (Text -> String)
-> Format String (Type -> 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) Type
tpe Text
name

data Type
  = VoidType
  | IntType !Int
  | PointerType !Type
  | ArrayType !Type !Int

instance Show Type where
  show :: Type -> String
show Type
VoidType = String
"void"
  show (IntType Int
n) = Format String (Int -> String) -> Int -> String
forall a. Format String a -> a
formatToString (Format (Int -> String) (Int -> String)
"i" Format (Int -> String) (Int -> String)
-> Format String (Int -> String) -> Format String (Int -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Int -> String)
forall a r. Integral a => Format r (a -> r)
int) Int
n
  show (PointerType Type
tpe) = String
"ptr"
  show (ArrayType Type
tpe Int
n) = String
"ptr"

arrayType :: Type -> Text
arrayType :: Type -> Text
arrayType (ArrayType Type
tpe Int
n) = Format Text (Int -> Type -> Text) -> Int -> Type -> Text
forall a. Format Text a -> a
sformat (Format (Int -> Type -> Text) (Int -> Type -> Text)
"<" Format (Int -> Type -> Text) (Int -> Type -> Text)
-> Format Text (Int -> Type -> Text)
-> Format Text (Int -> Type -> Text)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Type -> Text) (Int -> Type -> Text)
forall a r. Integral a => Format r (a -> r)
int Format (Type -> Text) (Int -> Type -> Text)
-> Format Text (Type -> Text) -> Format Text (Int -> Type -> Text)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> Text) (Type -> Text)
"x" Format (Type -> Text) (Type -> Text)
-> Format Text (Type -> Text) -> Format Text (Type -> Text)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format Text (Type -> Text)
forall a r. Show a => Format r (a -> r)
shown Format Text (Type -> Text)
-> Format Text Text -> Format Text (Type -> Text)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format Text Text
">") Int
n Type
tpe
arrayType Type
t = String -> Text
Text.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ Type -> String
forall a. Show a => a -> String
show Type
t

data BasicBlock = BasicBlock
  { BasicBlock -> Label
label :: !Label,
    BasicBlock -> [Instruction]
instructions :: ![Instruction]
  }

instance Show BasicBlock where
  show :: BasicBlock -> String
show (BasicBlock Label
label [Instruction]
insts) = 
    Format String (Label -> [Instruction] -> String)
-> Label -> [Instruction] -> String
forall a. Format String a -> a
formatToString (Format ([Instruction] -> String) (Label -> [Instruction] -> String)
forall a r. Show a => Format r (a -> r)
shown Format ([Instruction] -> String) (Label -> [Instruction] -> String)
-> Format String ([Instruction] -> String)
-> Format String (Label -> [Instruction] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Instruction] -> String) ([Instruction] -> String)
":\n" Format ([Instruction] -> String) ([Instruction] -> String)
-> Format String ([Instruction] -> String)
-> Format String ([Instruction] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Instruction -> Builder)
-> Format String ([Instruction] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
"\n" Format Builder (Instruction -> Builder)
forall a r. Show a => Format r (a -> r)
shown) Label
label [Instruction]
insts

data Var = Var
  { Var -> Int
id :: !VID,
    Var -> Type
tpe :: !Type,
    Var -> Range
loc :: !SL.Range
  }
  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)

formatVar :: Format r (Var -> r)
formatVar :: forall r. Format r (Var -> r)
formatVar = Format (Var -> r) (Var -> r)
"%v" Format (Var -> r) (Var -> r)
-> Format r (Var -> r) -> Format r (Var -> r)
forall r a r'. Format r a -> Format r' r -> Format r' a
% ((Int -> Const Int Int) -> Var -> Const Int Var)
-> Format r (Int -> 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 (Int -> Const Int Int) -> Var -> Const Int Var
#id Format r (Int -> r)
forall a r. Integral a => Format r (a -> r)
int

instance Show Var where
  show :: Var -> String
show = Format String (Var -> String) -> Var -> String
forall a. Format String a -> a
formatToString Format String (Var -> String)
forall r. Format r (Var -> r)
formatVar 

data Value
  = IntImm !Type !Int64
  | Variable !Var

valueType :: Value -> Type
valueType :: Value -> Type
valueType (IntImm Type
tpe Int64
_) = Type
tpe
valueType (Variable Var
var) = Var
var Var -> Getting Type Var Type -> Type
forall s a. s -> Getting a s a -> a
^. Getting Type Var Type
#tpe

instance Show Value where
  show :: Value -> String
show (IntImm Type
tpe Int64
n) = 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
n
  show (Variable Var
v) = Format String (Var -> String) -> Var -> String
forall a. Format String a -> a
formatToString Format String (Var -> String)
forall r. Format r (Var -> r)
formatVar Var
v

valueWithType :: Format r (Value -> r)
valueWithType :: forall r. Format r (Value -> r)
valueWithType = (Value -> Builder) -> Format r (Value -> r)
forall a r. (a -> Builder) -> Format r (a -> r)
later ((Value -> Builder) -> Format r (Value -> r))
-> (Value -> Builder) -> Format r (Value -> r)
forall a b. (a -> b) -> a -> b
$ \case
  (IntImm Type
tpe Int64
n) -> Format Builder (Type -> Int64 -> Builder)
-> Type -> Int64 -> Builder
forall a. Format Builder a -> a
bformat (Format (Int64 -> Builder) (Type -> Int64 -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format (Int64 -> Builder) (Type -> Int64 -> Builder)
-> Format Builder (Int64 -> Builder)
-> Format Builder (Type -> Int64 -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format Builder (Int64 -> Builder)
forall a r. Show a => Format r (a -> r)
shown) Type
tpe Int64
n
  (Variable Var
v) -> Format Builder (Type -> Var -> Builder) -> Type -> Var -> Builder
forall a. Format Builder a -> a
bformat (Format (Var -> Builder) (Type -> Var -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format (Var -> Builder) (Type -> Var -> Builder)
-> Format Builder (Var -> Builder)
-> Format Builder (Type -> Var -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format Builder (Var -> Builder)
forall r. Format r (Var -> r)
formatVar) (Var
v Var -> Getting Type Var Type -> Type
forall s a. s -> Getting a s a -> a
^. Getting Type Var Type
#tpe) Var
v

data CondCodes
  = EQL
  | NEQ
  | SGT
  | SGE
  | SLT
  | SLE
  deriving (CondCodes -> CondCodes -> Bool
(CondCodes -> CondCodes -> Bool)
-> (CondCodes -> CondCodes -> Bool) -> Eq CondCodes
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CondCodes -> CondCodes -> Bool
== :: CondCodes -> CondCodes -> Bool
$c/= :: CondCodes -> CondCodes -> Bool
/= :: CondCodes -> CondCodes -> Bool
Eq)

instance Show CondCodes where
  show :: CondCodes -> String
show CondCodes
EQL = String
"eq"
  show CondCodes
NEQ = String
"ne"
  show CondCodes
SGT = String
"sgt"
  show CondCodes
SGE = String
"sge"
  show CondCodes
SLT = String
"slt"
  show CondCodes
SLE = String
"sle"

data Instruction
  = Terminator !TermInst
  | Binary !BinaryInst
  | BitBinary !BitwiseBinaryInst
  | MemAccess !MemAccInst
  | ICmp !Var !CondCodes !Type !Value !Value
  | Assignment !Var !Value
  | Phi !Var !Type ![(Var, Label)]
--  | Select !Value !Type !Value !Value
  | Call !Var !Type !Name ![Value]

instance Show Instruction where
  show :: Instruction -> String
show (Terminator TermInst
t) = TermInst -> String
forall a. Show a => a -> String
show TermInst
t
  show (Binary BinaryInst
b) = BinaryInst -> String
forall a. Show a => a -> String
show BinaryInst
b
  show (BitBinary BitwiseBinaryInst
b) = BitwiseBinaryInst -> String
forall a. Show a => a -> String
show BitwiseBinaryInst
b
  show (MemAccess MemAccInst
m) = MemAccInst -> String
forall a. Show a => a -> String
show MemAccInst
m
  show (ICmp Var
var CondCodes
cc Type
tpe Value
v1 Value
v2) = Format
  String (Var -> CondCodes -> Type -> Value -> Value -> String)
-> Var -> CondCodes -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
  (CondCodes -> Type -> Value -> Value -> String)
  (Var -> CondCodes -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
  (CondCodes -> Type -> Value -> Value -> String)
  (Var -> CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
-> Format
     String (Var -> CondCodes -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (CondCodes -> Type -> Value -> Value -> String)
  (CondCodes -> Type -> Value -> Value -> String)
"=" Format
  (CondCodes -> Type -> Value -> Value -> String)
  (CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (CondCodes -> Type -> Value -> Value -> String)
  (CondCodes -> Type -> Value -> Value -> String)
"icmp" Format
  (CondCodes -> Type -> Value -> Value -> String)
  (CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (CondCodes -> Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Type -> Value -> Value -> String)
  (CondCodes -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (CondCodes -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
var CondCodes
cc Type
tpe Value
v1 Value
v2
  show (Assignment Var
var Value
val) = Format String (Var -> Type -> Value -> String)
-> Var -> Type -> Value -> String
forall a. Format String a -> a
formatToString (Format (Type -> Value -> String) (Var -> Type -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format (Type -> Value -> String) (Var -> Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Var -> Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> Value -> String) (Type -> Value -> String)
"=" Format (Type -> Value -> String) (Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Type -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Type -> Value -> String)
-> Format String (Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown) Var
var (Value -> Type
valueType Value
val) Value
val
  show (Phi Var
var Type
tpe [(Var, Label)]
preds) = Format String (Var -> Type -> [(Var, Label)] -> String)
-> Var -> Type -> [(Var, Label)] -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> [(Var, Label)] -> String)
  (Var -> Type -> [(Var, Label)] -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> [(Var, Label)] -> String)
  (Var -> Type -> [(Var, Label)] -> String)
-> Format String (Type -> [(Var, Label)] -> String)
-> Format String (Var -> Type -> [(Var, Label)] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> [(Var, Label)] -> String)
  (Type -> [(Var, Label)] -> String)
"= phi" Format
  (Type -> [(Var, Label)] -> String)
  (Type -> [(Var, Label)] -> String)
-> Format String (Type -> [(Var, Label)] -> String)
-> Format String (Type -> [(Var, Label)] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  ([(Var, Label)] -> String) (Type -> [(Var, Label)] -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  ([(Var, Label)] -> String) (Type -> [(Var, Label)] -> String)
-> Format String ([(Var, Label)] -> String)
-> Format String (Type -> [(Var, Label)] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Text
-> Format Builder ((Var, Label) -> Builder)
-> Format String ([(Var, Label)] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " (Format ((Var, Label) -> Builder) ((Var, Label) -> Builder)
"[" Format ((Var, Label) -> Builder) ((Var, Label) -> Builder)
-> Format Builder ((Var, Label) -> Builder)
-> Format Builder ((Var, Label) -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ ((Var -> Const Var Any) -> (Var, Label) -> Const Var (Any, Label))
-> Format Builder (Var -> Builder)
-> Format Builder ((Var, Label) -> Builder)
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, Label) -> Const Var (Any, Label)
forall s t a b. Field1 s t a b => Lens s t a b
Lens (Var, Label) (Any, Label) Var Any
_1 Format Builder (Var -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format Builder ((Var, Label) -> Builder)
-> Format Builder Builder
-> Format Builder ((Var, Label) -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format Builder Builder
", %" Format Builder ((Var, Label) -> Builder)
-> Format Builder ((Var, Label) -> Builder)
-> Format Builder ((Var, Label) -> Builder)
forall a. Semigroup a => a -> a -> a
<> ((Label -> Const Label Any)
 -> (Var, Label) -> Const Label (Var, Any))
-> Format Builder (Label -> Builder)
-> Format Builder ((Var, Label) -> Builder)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Label -> Const Label Any)
-> (Var, Label) -> Const Label (Var, Any)
forall s t a b. Field2 s t a b => Lens s t a b
Lens (Var, Label) (Var, Any) Label Any
_2 Format Builder (Label -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format Builder ((Var, Label) -> Builder)
-> Format Builder Builder
-> Format Builder ((Var, Label) -> Builder)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format Builder Builder
"]")) Var
var Type
tpe [(Var, Label)]
preds
  show (Call Var
var Type
VoidType Text
name [Value]
args) = Format String (Type -> Text -> [Value] -> String)
-> Type -> Text -> [Value] -> String
forall a. Format String a -> a
formatToString
    (Format
  (Type -> Text -> [Value] -> String)
  (Type -> Text -> [Value] -> String)
"call" Format
  (Type -> Text -> [Value] -> String)
  (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Text -> [Value] -> String) (Type -> Text -> [Value] -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Text -> [Value] -> String) (Type -> Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Text -> [Value] -> String) (Text -> [Value] -> String)
"@" Format (Text -> [Value] -> String) (Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Value] -> String) (Text -> [Value] -> String)
forall r. Format r (Text -> r)
stext Format ([Value] -> String) (Text -> [Value] -> String)
-> Format String ([Value] -> String)
-> Format String (Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Value] -> String) ([Value] -> String)
"(" Format ([Value] -> String) ([Value] -> String)
-> Format String ([Value] -> String)
-> Format String ([Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Value -> Builder)
-> Format String ([Value] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " Format Builder (Value -> Builder)
forall r. Format r (Value -> r)
valueWithType Format String ([Value] -> String)
-> Format String String -> Format String ([Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
")")
    Type
VoidType Text
name [Value]
args
  show (Call Var
var Type
tpe Text
name [Value]
args) = Format String (Var -> Type -> Text -> [Value] -> String)
-> Var -> Type -> Text -> [Value] -> String
forall a. Format String a -> a
formatToString
    (Format
  (Type -> Text -> [Value] -> String)
  (Var -> Type -> Text -> [Value] -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> Text -> [Value] -> String)
  (Var -> Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
-> Format String (Var -> Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Text -> [Value] -> String)
  (Type -> Text -> [Value] -> String)
"=" Format
  (Type -> Text -> [Value] -> String)
  (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Text -> [Value] -> String)
  (Type -> Text -> [Value] -> String)
"call" Format
  (Type -> Text -> [Value] -> String)
  (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Text -> [Value] -> String) (Type -> Text -> [Value] -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Text -> [Value] -> String) (Type -> Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
-> Format String (Type -> Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Text -> [Value] -> String) (Text -> [Value] -> String)
"@" Format (Text -> [Value] -> String) (Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
-> Format String (Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Value] -> String) (Text -> [Value] -> String)
forall r. Format r (Text -> r)
stext Format ([Value] -> String) (Text -> [Value] -> String)
-> Format String ([Value] -> String)
-> Format String (Text -> [Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format ([Value] -> String) ([Value] -> String)
"(" Format ([Value] -> String) ([Value] -> String)
-> Format String ([Value] -> String)
-> Format String ([Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder (Value -> Builder)
-> Format String ([Value] -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " Format Builder (Value -> Builder)
forall r. Format r (Value -> r)
valueWithType Format String ([Value] -> String)
-> Format String String -> Format String ([Value] -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String String
")")
    Var
var Type
tpe Text
name [Value]
args

data TermInst
  = Ret !(Maybe Value) !Type
  | BrUncon !Label
  | BrCon !Value !Label !Label

instance Show TermInst where
  show :: TermInst -> String
show (Ret Maybe Value
Nothing Type
tpe) = String
"ret void"
  show (Ret (Just Value
val) Type
tpe) = Format String (Type -> Value -> String) -> Type -> Value -> String
forall a. Format String a -> a
formatToString (Format (Type -> Value -> String) (Type -> Value -> String)
"ret" Format (Type -> Value -> String) (Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Type -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Type -> Value -> String)
-> Format String (Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown) Type
tpe Value
val
  show (BrUncon Label
label) = Format String (Label -> String) -> Label -> String
forall a. Format String a -> a
formatToString (Format (Label -> String) (Label -> String)
"br label %" Format (Label -> String) (Label -> String)
-> Format String (Label -> String)
-> Format String (Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Label -> String)
forall a r. Show a => Format r (a -> r)
shown) Label
label
  show (BrCon Value
val Label
l1 Label
l2) =
    Format String (Value -> Label -> Label -> String)
-> Value -> Label -> Label -> String
forall a. Format String a -> a
formatToString (Format
  (Value -> Label -> Label -> String)
  (Value -> Label -> Label -> String)
"br" Format
  (Value -> Label -> Label -> String)
  (Value -> Label -> Label -> String)
-> Format String (Value -> Label -> Label -> String)
-> Format String (Value -> Label -> Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Label -> Label -> String) (Value -> Label -> Label -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Label -> Label -> String) (Value -> Label -> Label -> String)
-> Format String (Label -> Label -> String)
-> Format String (Value -> Label -> Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Label -> Label -> String) (Label -> Label -> String)
", label %" Format (Label -> Label -> String) (Label -> Label -> String)
-> Format String (Label -> Label -> String)
-> Format String (Label -> Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Label -> String) (Label -> Label -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Label -> String) (Label -> Label -> String)
-> Format String (Label -> String)
-> Format String (Label -> Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Label -> String) (Label -> String)
", label %" Format (Label -> String) (Label -> String)
-> Format String (Label -> String)
-> Format String (Label -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Label -> String)
forall a r. Show a => Format r (a -> r)
shown) Value
val Label
l1 Label
l2

data BinaryInst
  = Add !Var !Type !Value !Value
  | Sub !Var !Type !Value !Value
  | Mul !Var !Type !Value !Value
  | SDiv !Var !Type !Value !Value

instance Show BinaryInst where
  show :: BinaryInst -> String
show (Add Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"=" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"add" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
    Var
var Type
tpe Value
v1 Value
v2
  show (Sub Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"=" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"sub" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
    Var
var Type
tpe Value
v1 Value
v2
  show (Mul Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"=" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"mul" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
    Var
var Type
tpe Value
v1 Value
v2
  show (SDiv Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"=" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"sdiv" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
    Var
var Type
tpe Value
v1 Value
v2

data BitwiseBinaryInst
  = And !Var !Type !Value !Value
  | Or !Var !Type !Value !Value

instance Show BitwiseBinaryInst where
  show :: BitwiseBinaryInst -> String
show (And Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"=" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"and" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
    Var
var Type
tpe Value
v1 Value
v2
  show (Or Var
var Type
tpe Value
v1 Value
v2) = Format String (Var -> Type -> Value -> Value -> String)
-> Var -> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> Value -> Value -> String)
  (Var -> Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Var -> Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"=" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"or" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
    Var
var Type
tpe Value
v1 Value
v2

data MemAccInst
  = Alloca !Var !Type !Int64
  | Load !Var !Type !Value
  | Store !Type !Value !Value
  | StoreVec !Type ![(Type, Value)] !Value

instance Show MemAccInst where
  show :: MemAccInst -> String
show (Alloca Var
var Type
tpe Int64
n) = Format String (Var -> Type -> Type -> Int64 -> String)
-> Var -> Type -> Type -> Int64 -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> Type -> Int64 -> String)
  (Var -> Type -> Type -> Int64 -> String)
forall r. Format r (Var -> r)
formatVar Format
  (Type -> Type -> Int64 -> String)
  (Var -> Type -> Type -> Int64 -> String)
-> Format String (Type -> Type -> Int64 -> String)
-> Format String (Var -> Type -> Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Type -> Type -> Int64 -> String) (Type -> Type -> Int64 -> String)
"= alloca " Format
  (Type -> Type -> Int64 -> String) (Type -> Type -> Int64 -> String)
-> Format String (Type -> Type -> Int64 -> String)
-> Format String (Type -> Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Type -> Int64 -> String) (Type -> Type -> Int64 -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Type -> Int64 -> String) (Type -> Type -> Int64 -> String)
-> Format String (Type -> Int64 -> String)
-> Format String (Type -> Type -> Int64 -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Type -> Int64 -> String) (Type -> Int64 -> String)
", " 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
var Type
tpe Type
tpe Int64
n
  show (Load Var
var Type
tpe Value
val) = Format String (Var -> Type -> Value -> String)
-> Var -> Type -> Value -> String
forall a. Format String a -> a
formatToString (Format (Type -> Value -> String) (Var -> Type -> Value -> String)
forall r. Format r (Var -> r)
formatVar Format (Type -> Value -> String) (Var -> Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Var -> Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Type -> Value -> String) (Type -> Value -> String)
"= load " Format (Type -> Value -> String) (Type -> Value -> String)
-> Format String (Type -> Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Type -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Type -> Value -> String)
-> Format String (Value -> String)
-> Format String (Type -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
"ptr" Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
    Var
var Type
tpe Value
val 
  show (Store Type
tpe Value
val Value
ptr) = Format String (Type -> Value -> Value -> String)
-> Type -> Value -> Value -> String
forall a. Format String a -> a
formatToString (Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
"store" Format
  (Type -> Value -> Value -> String)
  (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format
  (Value -> Value -> String) (Type -> Value -> Value -> String)
-> Format String (Value -> Value -> String)
-> Format String (Type -> Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> Value -> String)
forall a r. Show a => Format r (a -> r)
shown Format (Value -> String) (Value -> Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
", ptr " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown) Type
tpe Value
val Value
ptr
  show (StoreVec Type
tpe [(Type, Value)]
vals Value
ptr) = Format String (Text -> [(Type, Value)] -> Value -> String)
-> Text -> [(Type, Value)] -> Value -> String
forall a. Format String a -> a
formatToString
    (Format
  (Text -> [(Type, Value)] -> Value -> String)
  (Text -> [(Type, Value)] -> Value -> String)
"store" Format
  (Text -> [(Type, Value)] -> Value -> String)
  (Text -> [(Type, Value)] -> Value -> String)
-> Format String (Text -> [(Type, Value)] -> Value -> String)
-> Format String (Text -> [(Type, Value)] -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  ([(Type, Value)] -> Value -> String)
  (Text -> [(Type, Value)] -> Value -> String)
forall r. Format r (Text -> r)
stext Format
  ([(Type, Value)] -> Value -> String)
  (Text -> [(Type, Value)] -> Value -> String)
-> Format String ([(Type, Value)] -> Value -> String)
-> Format String (Text -> [(Type, Value)] -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format
  ([(Type, Value)] -> Value -> String)
  ([(Type, Value)] -> Value -> String)
"<" Format
  ([(Type, Value)] -> Value -> String)
  ([(Type, Value)] -> Value -> String)
-> Format String ([(Type, Value)] -> Value -> String)
-> Format String ([(Type, Value)] -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Text
-> Format Builder ((Type, Value) -> Builder)
-> Format (Value -> String) ([(Type, Value)] -> Value -> String)
forall (t :: * -> *) a r.
Foldable t =>
Text -> Format Builder (a -> Builder) -> Format r (t a -> r)
intercalated Text
", " (((Type -> Const Type Any)
 -> (Type, Value) -> Const Type (Any, Value))
-> Format Builder (Type -> Builder)
-> Format Builder ((Type, Value) -> Builder)
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 Any)
-> (Type, Value) -> Const Type (Any, Value)
forall s t a b. Field1 s t a b => Lens s t a b
Lens (Type, Value) (Any, Value) Type Any
_1 Format Builder (Type -> Builder)
forall a r. Show a => Format r (a -> r)
shown Format Builder ((Type, Value) -> Builder)
-> Format Builder ((Type, Value) -> Builder)
-> Format Builder ((Type, Value) -> Builder)
forall r a.
Format r (a -> r) -> Format r (a -> r) -> Format r (a -> r)
<%+> ((Value -> Const Value Any)
 -> (Type, Value) -> Const Value (Type, Any))
-> Format Builder (Value -> Builder)
-> Format Builder ((Type, Value) -> Builder)
forall a b s t r.
((a -> Const a b) -> s -> Const a t)
-> Format r (a -> r) -> Format r (s -> r)
viewed (Value -> Const Value Any)
-> (Type, Value) -> Const Value (Type, Any)
forall s t a b. Field2 s t a b => Lens s t a b
Lens (Type, Value) (Type, Any) Value Any
_2 Format Builder (Value -> Builder)
forall a r. Show a => Format r (a -> r)
shown) Format (Value -> String) ([(Type, Value)] -> Value -> String)
-> Format String (Value -> String)
-> Format String ([(Type, Value)] -> Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format (Value -> String) (Value -> String)
">" Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
%+ Format (Value -> String) (Value -> String)
", ptr " Format (Value -> String) (Value -> String)
-> Format String (Value -> String)
-> Format String (Value -> String)
forall r a r'. Format r a -> Format r' r -> Format r' a
% Format String (Value -> String)
forall a r. Show a => Format r (a -> r)
shown)
    (Type -> Text
arrayType Type
tpe) [(Type, Value)]
vals Value
ptr