mirror of
https://github.com/anoma/juvix.git
synced 2025-01-07 16:22:14 +03:00
Compute temporary stack height in JuvixTree (#2596)
This commit is contained in:
parent
1153f6b338
commit
4651d1eafe
@ -20,7 +20,7 @@ toReg' = validate >=> filterUnreachable >=> computeStackUsage >=> computePreallo
|
|||||||
-- | Perform transformations on JuvixAsm necessary before the translation to
|
-- | Perform transformations on JuvixAsm necessary before the translation to
|
||||||
-- Nockma
|
-- Nockma
|
||||||
toNockma' :: (Members '[Error AsmError, Reader Options] r) => InfoTable -> Sem r InfoTable
|
toNockma' :: (Members '[Error AsmError, Reader Options] r) => InfoTable -> Sem r InfoTable
|
||||||
toNockma' = validate >=> filterUnreachable >=> computeTempHeight
|
toNockma' = validate >=> filterUnreachable
|
||||||
|
|
||||||
toReg :: (Members '[Error JuvixError, Reader EntryPoint] r) => InfoTable -> Sem r InfoTable
|
toReg :: (Members '[Error JuvixError, Reader EntryPoint] r) => InfoTable -> Sem r InfoTable
|
||||||
toReg = mapReader fromEntryPoint . mapError (JuvixError @AsmError) . toReg'
|
toReg = mapReader fromEntryPoint . mapError (JuvixError @AsmError) . toReg'
|
||||||
|
@ -3,12 +3,10 @@ module Juvix.Compiler.Asm.Transformation
|
|||||||
module Juvix.Compiler.Asm.Transformation.Prealloc,
|
module Juvix.Compiler.Asm.Transformation.Prealloc,
|
||||||
module Juvix.Compiler.Asm.Transformation.Validate,
|
module Juvix.Compiler.Asm.Transformation.Validate,
|
||||||
module Juvix.Compiler.Asm.Transformation.FilterUnreachable,
|
module Juvix.Compiler.Asm.Transformation.FilterUnreachable,
|
||||||
module Juvix.Compiler.Asm.Transformation.TempHeight,
|
|
||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Juvix.Compiler.Asm.Transformation.FilterUnreachable
|
import Juvix.Compiler.Asm.Transformation.FilterUnreachable
|
||||||
import Juvix.Compiler.Asm.Transformation.Prealloc
|
import Juvix.Compiler.Asm.Transformation.Prealloc
|
||||||
import Juvix.Compiler.Asm.Transformation.StackUsage
|
import Juvix.Compiler.Asm.Transformation.StackUsage
|
||||||
import Juvix.Compiler.Asm.Transformation.TempHeight
|
|
||||||
import Juvix.Compiler.Asm.Transformation.Validate
|
import Juvix.Compiler.Asm.Transformation.Validate
|
||||||
|
@ -1,75 +0,0 @@
|
|||||||
module Juvix.Compiler.Asm.Transformation.TempHeight where
|
|
||||||
|
|
||||||
import Juvix.Compiler.Asm.Transformation.Base
|
|
||||||
|
|
||||||
computeFunctionTempHeight ::
|
|
||||||
(Member (Error AsmError) r) =>
|
|
||||||
InfoTable ->
|
|
||||||
FunctionInfo ->
|
|
||||||
Sem r FunctionInfo
|
|
||||||
computeFunctionTempHeight tab fi = do
|
|
||||||
ps :: [Command] <- recurseS sig (fi ^. functionCode)
|
|
||||||
return (set functionCode ps fi)
|
|
||||||
where
|
|
||||||
sig :: RecursorSig StackInfo r Command
|
|
||||||
sig =
|
|
||||||
RecursorSig
|
|
||||||
{ _recursorInfoTable = tab,
|
|
||||||
_recurseInstr = goInstr,
|
|
||||||
_recurseBranch = goBranch,
|
|
||||||
_recurseCase = goCase,
|
|
||||||
_recurseSave = goSave
|
|
||||||
}
|
|
||||||
|
|
||||||
goInstr :: StackInfo -> CmdInstr -> Sem r Command
|
|
||||||
goInstr si cmd@(CmdInstr _ instr) = case instr of
|
|
||||||
Push (Ref (DRef (TempRef r))) ->
|
|
||||||
let h = si ^. stackInfoTempStackHeight
|
|
||||||
r' = set refTempTempHeight (Just h) r
|
|
||||||
instr' = Push (Ref (DRef (TempRef r')))
|
|
||||||
in return (Instr (set cmdInstrInstruction instr' cmd))
|
|
||||||
Push (Ref (ConstrRef field@Field {_fieldRef = TempRef r})) ->
|
|
||||||
let h = si ^. stackInfoTempStackHeight
|
|
||||||
r' = set refTempTempHeight (Just h) r
|
|
||||||
instr' =
|
|
||||||
Push
|
|
||||||
( Ref
|
|
||||||
( ConstrRef
|
|
||||||
field
|
|
||||||
{ _fieldRef = TempRef r'
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
in return (Instr (set cmdInstrInstruction instr' cmd))
|
|
||||||
_ -> return (Instr cmd)
|
|
||||||
|
|
||||||
goCase :: StackInfo -> CmdCase -> [Code] -> Maybe Code -> Sem r Command
|
|
||||||
goCase _ cmd brs mdef =
|
|
||||||
return
|
|
||||||
( Case
|
|
||||||
cmd
|
|
||||||
{ _cmdCaseBranches = branches',
|
|
||||||
_cmdCaseDefault = mdef
|
|
||||||
}
|
|
||||||
)
|
|
||||||
where
|
|
||||||
branches' :: [CaseBranch]
|
|
||||||
branches' =
|
|
||||||
[ set caseBranchCode newCode oldBr
|
|
||||||
| (oldBr, newCode) <- zipExact (cmd ^. cmdCaseBranches) brs
|
|
||||||
]
|
|
||||||
|
|
||||||
goBranch :: StackInfo -> CmdBranch -> Code -> Code -> Sem r Command
|
|
||||||
goBranch _ cmd t f =
|
|
||||||
return
|
|
||||||
( Branch
|
|
||||||
cmd
|
|
||||||
{ _cmdBranchTrue = t,
|
|
||||||
_cmdBranchFalse = f
|
|
||||||
}
|
|
||||||
)
|
|
||||||
goSave :: StackInfo -> CmdSave -> Code -> Sem r Command
|
|
||||||
goSave _ cmd code = return (Save (set cmdSaveCode code cmd))
|
|
||||||
|
|
||||||
computeTempHeight :: (Member (Error AsmError) r) => InfoTable -> Sem r InfoTable
|
|
||||||
computeTempHeight tab = liftFunctionTransformation (computeFunctionTempHeight tab) tab
|
|
@ -9,6 +9,7 @@ data TransformationId
|
|||||||
| IdentityU
|
| IdentityU
|
||||||
| IdentityD
|
| IdentityD
|
||||||
| Apply
|
| Apply
|
||||||
|
| TempHeight
|
||||||
deriving stock (Data, Bounded, Enum, Show)
|
deriving stock (Data, Bounded, Enum, Show)
|
||||||
|
|
||||||
data PipelineId
|
data PipelineId
|
||||||
@ -19,7 +20,7 @@ data PipelineId
|
|||||||
type TransformationLikeId = TransformationLikeId' TransformationId PipelineId
|
type TransformationLikeId = TransformationLikeId' TransformationId PipelineId
|
||||||
|
|
||||||
toNockmaTransformations :: [TransformationId]
|
toNockmaTransformations :: [TransformationId]
|
||||||
toNockmaTransformations = [Apply]
|
toNockmaTransformations = [Apply, TempHeight]
|
||||||
|
|
||||||
toAsmTransformations :: [TransformationId]
|
toAsmTransformations :: [TransformationId]
|
||||||
toAsmTransformations = []
|
toAsmTransformations = []
|
||||||
@ -31,6 +32,7 @@ instance TransformationId' TransformationId where
|
|||||||
IdentityU -> strIdentityU
|
IdentityU -> strIdentityU
|
||||||
IdentityD -> strIdentityD
|
IdentityD -> strIdentityD
|
||||||
Apply -> strApply
|
Apply -> strApply
|
||||||
|
TempHeight -> strTempHeight
|
||||||
|
|
||||||
instance PipelineId' TransformationId PipelineId where
|
instance PipelineId' TransformationId PipelineId where
|
||||||
pipelineText :: PipelineId -> Text
|
pipelineText :: PipelineId -> Text
|
||||||
|
@ -19,3 +19,6 @@ strIdentityD = "identity-dmap"
|
|||||||
|
|
||||||
strApply :: Text
|
strApply :: Text
|
||||||
strApply = "apply"
|
strApply = "apply"
|
||||||
|
|
||||||
|
strTempHeight :: Text
|
||||||
|
strTempHeight = "temp-height"
|
||||||
|
@ -9,6 +9,7 @@ import Juvix.Compiler.Tree.Data.TransformationId
|
|||||||
import Juvix.Compiler.Tree.Transformation.Apply
|
import Juvix.Compiler.Tree.Transformation.Apply
|
||||||
import Juvix.Compiler.Tree.Transformation.Base
|
import Juvix.Compiler.Tree.Transformation.Base
|
||||||
import Juvix.Compiler.Tree.Transformation.Identity
|
import Juvix.Compiler.Tree.Transformation.Identity
|
||||||
|
import Juvix.Compiler.Tree.Transformation.TempHeight
|
||||||
|
|
||||||
applyTransformations :: forall r. [TransformationId] -> InfoTable -> Sem r InfoTable
|
applyTransformations :: forall r. [TransformationId] -> InfoTable -> Sem r InfoTable
|
||||||
applyTransformations ts tbl = foldM (flip appTrans) tbl ts
|
applyTransformations ts tbl = foldM (flip appTrans) tbl ts
|
||||||
@ -19,3 +20,4 @@ applyTransformations ts tbl = foldM (flip appTrans) tbl ts
|
|||||||
IdentityU -> return . identityU
|
IdentityU -> return . identityU
|
||||||
IdentityD -> return . identityD
|
IdentityD -> return . identityD
|
||||||
Apply -> return . computeApply
|
Apply -> return . computeApply
|
||||||
|
TempHeight -> return . computeTempHeight
|
||||||
|
25
src/Juvix/Compiler/Tree/Transformation/TempHeight.hs
Normal file
25
src/Juvix/Compiler/Tree/Transformation/TempHeight.hs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
module Juvix.Compiler.Tree.Transformation.TempHeight where
|
||||||
|
|
||||||
|
import Juvix.Compiler.Tree.Extra.Recursors
|
||||||
|
import Juvix.Compiler.Tree.Transformation.Base
|
||||||
|
|
||||||
|
computeFunctionTempHeight :: Node -> Node
|
||||||
|
computeFunctionTempHeight = umapN go
|
||||||
|
where
|
||||||
|
go :: Int -> Node -> Node
|
||||||
|
go k = \case
|
||||||
|
MemRef (DRef (TempRef r)) ->
|
||||||
|
let r' = set refTempTempHeight (Just k) r
|
||||||
|
in MemRef $ DRef (TempRef r')
|
||||||
|
MemRef (ConstrRef field@Field {_fieldRef = TempRef r}) ->
|
||||||
|
let r' = set refTempTempHeight (Just k) r
|
||||||
|
in MemRef
|
||||||
|
( ConstrRef
|
||||||
|
field
|
||||||
|
{ _fieldRef = TempRef r'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
node -> node
|
||||||
|
|
||||||
|
computeTempHeight :: InfoTable -> InfoTable
|
||||||
|
computeTempHeight = mapT (const computeFunctionTempHeight)
|
Loading…
Reference in New Issue
Block a user