Skip to content

Commit

Permalink
Dead code elimination in JuvixReg (#2835)
Browse files Browse the repository at this point in the history
* Closes #2827 
* Adds an optimization phase to the JuvixReg -> Casm pipeline, which
consists of repeated copy & constant propagation and dead code
elimination.
  • Loading branch information
lukaszcz authored Jun 24, 2024
1 parent e43797f commit 7bb663c
Show file tree
Hide file tree
Showing 22 changed files with 443 additions and 169 deletions.
7 changes: 5 additions & 2 deletions app/Commands/Dev/Reg/Read.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module Commands.Dev.Reg.Read where

import Commands.Base
import Commands.Dev.Reg.Read.Options
import Juvix.Compiler.Reg.Pretty qualified as Reg
import Juvix.Compiler.Reg.Pretty qualified as Reg hiding (defaultOptions)
import Juvix.Compiler.Reg.Transformation qualified as Reg
import Juvix.Compiler.Reg.Translation.FromSource qualified as Reg
import RegInterpreter
Expand All @@ -15,7 +15,10 @@ runCommand opts = do
Left err ->
exitJuvixError (JuvixError err)
Right tab -> do
r <- runError @JuvixError (Reg.applyTransformations (project opts ^. regReadTransformations) tab)
r <-
runError @JuvixError
. runReader Reg.defaultOptions
$ (Reg.applyTransformations (project opts ^. regReadTransformations) tab)
case r of
Left err -> exitJuvixError (JuvixError err)
Right tab' -> do
Expand Down
10 changes: 7 additions & 3 deletions src/Juvix/Compiler/Asm/Options.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ where

import Juvix.Compiler.Backend
import Juvix.Compiler.Pipeline.EntryPoint
import Juvix.Compiler.Tree.Options qualified as Tree
import Juvix.Prelude

data Options = Options
{ _optDebug :: Bool,
_optLimits :: Limits
_optLimits :: Limits,
_optTreeOptions :: Tree.Options
}

makeLenses ''Options
Expand All @@ -19,7 +21,8 @@ makeOptions :: Target -> Bool -> Options
makeOptions tgt debug =
Options
{ _optDebug = debug,
_optLimits = getLimits tgt debug
_optLimits = getLimits tgt debug,
_optTreeOptions = Tree.defaultOptions
}

getClosureSize :: Options -> Int -> Int
Expand All @@ -29,5 +32,6 @@ fromEntryPoint :: EntryPoint -> Options
fromEntryPoint e@EntryPoint {..} =
Options
{ _optDebug = _entryPointDebug,
_optLimits = getLimits (getEntryPointTarget e) _entryPointDebug
_optLimits = getLimits (getEntryPointTarget e) _entryPointDebug,
_optTreeOptions = Tree.fromEntryPoint e
}
12 changes: 9 additions & 3 deletions src/Juvix/Compiler/Pipeline.hs
Original file line number Diff line number Diff line change
Expand Up @@ -358,18 +358,24 @@ regToRust = regToRust' Rust.BackendRust
regToRiscZeroRust :: (Member (Reader EntryPoint) r) => Reg.InfoTable -> Sem r Rust.Result
regToRiscZeroRust = regToRust' Rust.BackendRiscZero

regToCasm :: Reg.InfoTable -> Sem r Casm.Result
regToCasm :: (Member (Reader EntryPoint) r) => Reg.InfoTable -> Sem r Casm.Result
regToCasm = Reg.toCasm >=> return . Casm.fromReg

regToCasm' :: (Member (Reader Reg.Options) r) => Reg.InfoTable -> Sem r Casm.Result
regToCasm' = Reg.toCasm' >=> return . Casm.fromReg

casmToCairo :: Casm.Result -> Sem r Cairo.Result
casmToCairo Casm.Result {..} =
return
. Cairo.serialize _resultOutputSize (map Casm.builtinName _resultBuiltins)
$ Cairo.fromCasm _resultCode

regToCairo :: Reg.InfoTable -> Sem r Cairo.Result
regToCairo :: (Member (Reader EntryPoint) r) => Reg.InfoTable -> Sem r Cairo.Result
regToCairo = regToCasm >=> casmToCairo

regToCairo' :: (Member (Reader Reg.Options) r) => Reg.InfoTable -> Sem r Cairo.Result
regToCairo' = regToCasm' >=> casmToCairo

treeToAnoma' :: (Members '[Error JuvixError, Reader NockmaTree.CompilerOptions] r) => Tree.InfoTable -> Sem r NockmaTree.AnomaResult
treeToAnoma' = Tree.toNockma >=> NockmaTree.fromTreeTable

Expand All @@ -378,6 +384,6 @@ asmToMiniC' = mapError (JuvixError @Asm.AsmError) . Asm.toReg' >=> regToMiniC' .

regToMiniC' :: (Member (Reader Asm.Options) r) => Reg.InfoTable -> Sem r C.MiniCResult
regToMiniC' tab = do
tab' <- Reg.toC tab
tab' <- mapReader (^. Asm.optTreeOptions) $ Reg.toC' tab
e <- ask
return $ C.fromReg (e ^. Asm.optLimits) tab'
8 changes: 7 additions & 1 deletion src/Juvix/Compiler/Reg/Data/TransformationId.hs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ data TransformationId
| InitBranchVars
| CopyPropagation
| ConstantPropagation
| DeadCodeElimination
| OptPhaseMain
| OptPhaseCairo
deriving stock (Data, Bounded, Enum, Show)

data PipelineId
Expand All @@ -28,7 +31,7 @@ toRustTransformations :: [TransformationId]
toRustTransformations = [Cleanup]

toCasmTransformations :: [TransformationId]
toCasmTransformations = [Cleanup, CopyPropagation, ConstantPropagation, SSA]
toCasmTransformations = [Cleanup, SSA, OptPhaseCairo]

instance TransformationId' TransformationId where
transformationText :: TransformationId -> Text
Expand All @@ -39,6 +42,9 @@ instance TransformationId' TransformationId where
InitBranchVars -> strInitBranchVars
CopyPropagation -> strCopyPropagation
ConstantPropagation -> strConstantPropagation
DeadCodeElimination -> strDeadCodeElimination
OptPhaseMain -> strOptPhaseMain
OptPhaseCairo -> strOptPhaseCairo

instance PipelineId' TransformationId PipelineId where
pipelineText :: PipelineId -> Text
Expand Down
9 changes: 9 additions & 0 deletions src/Juvix/Compiler/Reg/Data/TransformationId/Strings.hs
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,12 @@ strCopyPropagation = "copy-propagation"

strConstantPropagation :: Text
strConstantPropagation = "constant-propagation"

strDeadCodeElimination :: Text
strDeadCodeElimination = "dead-code"

strOptPhaseMain :: Text
strOptPhaseMain = "opt-main"

strOptPhaseCairo :: Text
strOptPhaseCairo = "opt-cairo"
Loading

0 comments on commit 7bb663c

Please sign in to comment.