module Asm.L ( mkLive, liveBB ) where

import           Asm.Ar
import           Asm.BB
import           CF
import           LR

mkLive :: (Arch arch reg freg f2) => [arch reg freg f2 ()] -> [arch reg freg f2 Liveness]
mkLive :: forall (arch :: * -> * -> * -> * -> *) reg freg f2.
Arch arch reg freg f2 =>
[arch reg freg f2 ()] -> [arch reg freg f2 Liveness]
mkLive = (BB arch reg freg f2 () Liveness -> [arch reg freg f2 Liveness])
-> [BB arch reg freg f2 () Liveness] -> [arch reg freg f2 Liveness]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap BB arch reg freg f2 () Liveness -> [arch reg freg f2 Liveness]
forall (arch :: * -> * -> * -> * -> *) reg freg f2reg.
Arch arch reg freg f2reg =>
BB arch reg freg f2reg () Liveness
-> [arch reg freg f2reg Liveness]
expand([BB arch reg freg f2 () Liveness] -> [arch reg freg f2 Liveness])
-> ([arch reg freg f2 ()] -> [BB arch reg freg f2 () Liveness])
-> [arch reg freg f2 ()]
-> [arch reg freg f2 Liveness]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [arch reg freg f2 ()] -> [BB arch reg freg f2 () Liveness]
forall (arch :: * -> * -> * -> * -> *) reg freg f2.
Arch arch reg freg f2 =>
[arch reg freg f2 ()] -> [BB arch reg freg f2 () Liveness]
liveBB

liveBB :: (Arch arch reg freg f2) => [arch reg freg f2 ()] -> [BB arch reg freg f2 () Liveness]
liveBB :: forall (arch :: * -> * -> * -> * -> *) reg freg f2.
Arch arch reg freg f2 =>
[arch reg freg f2 ()] -> [BB arch reg freg f2 () Liveness]
liveBB = (BB arch reg freg f2 () NLiveness
 -> BB arch reg freg f2 () Liveness)
-> [BB arch reg freg f2 () NLiveness]
-> [BB arch reg freg f2 () Liveness]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((NLiveness -> Liveness)
-> BB arch reg freg f2 () NLiveness
-> BB arch reg freg f2 () Liveness
forall a b.
(a -> b) -> BB arch reg freg f2 () a -> BB arch reg freg f2 () b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NLiveness -> Liveness
liveness) ([BB arch reg freg f2 () NLiveness]
 -> [BB arch reg freg f2 () Liveness])
-> ([arch reg freg f2 ()] -> [BB arch reg freg f2 () NLiveness])
-> [arch reg freg f2 ()]
-> [BB arch reg freg f2 () Liveness]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [BB arch reg freg f2 () ControlAnn]
-> [BB arch reg freg f2 () NLiveness]
forall {p :: * -> *}.
Copointed p =>
[p ControlAnn] -> [p NLiveness]
reconstructFlat ([BB arch reg freg f2 () ControlAnn]
 -> [BB arch reg freg f2 () NLiveness])
-> ([arch reg freg f2 ()] -> [BB arch reg freg f2 () ControlAnn])
-> [arch reg freg f2 ()]
-> [BB arch reg freg f2 () NLiveness]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [BB arch reg freg f2 () ()] -> [BB arch reg freg f2 () ControlAnn]
forall (arch :: * -> * -> * -> * -> *) reg freg f2reg.
Arch arch reg freg f2reg =>
[BB arch reg freg f2reg () ()]
-> [BB arch reg freg f2reg () ControlAnn]
cf ([BB arch reg freg f2 () ()]
 -> [BB arch reg freg f2 () ControlAnn])
-> ([arch reg freg f2 ()] -> [BB arch reg freg f2 () ()])
-> [arch reg freg f2 ()]
-> [BB arch reg freg f2 () ControlAnn]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [arch reg freg f2 ()] -> [BB arch reg freg f2 () ()]
forall a. [arch reg freg f2 a] -> [BB arch reg freg f2 a ()]
forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a.
Arch arch reg freg f2reg =>
[arch reg freg f2reg a] -> [BB arch reg freg f2reg a ()]
bb