aboutsummaryrefslogtreecommitdiff
path: root/Sil
diff options
context:
space:
mode:
authorCamil Staps2017-07-24 18:21:34 +0200
committerCamil Staps2017-07-24 18:21:34 +0200
commit7d1448c8fa4fe530dbeda92ff3f85bebb33ad75f (patch)
treebc1b720bff920d3ca705b47cbc5782acdef0eb69 /Sil
parentUpdate for gcc 6 (diff)
Optimisations
Diffstat (limited to 'Sil')
-rw-r--r--Sil/Compile.icl19
1 files changed, 18 insertions, 1 deletions
diff --git a/Sil/Compile.icl b/Sil/Compile.icl
index 7e836b8..49546df 100644
--- a/Sil/Compile.icl
+++ b/Sil/Compile.icl
@@ -40,9 +40,26 @@ nop :: RWST r w s m () | Monoid w & Monad m
nop = RWST \_ s -> pure ((), s, mempty)
compile :: Program -> MaybeError CompileError 'ABC'.Assembler
-compile prog = case evalRWST (gen prog) () zero of
+compile prog = case evalRWST (censor censor` $ gen prog) () zero of
Error e -> Error e
Ok (_,p) -> Ok p
+where
+ censor` = opt o filter isUseful
+
+ opt :: 'ABC'.Assembler -> 'ABC'.Assembler
+ opt ['ABC'.PushI i:'ABC'.Push_b l:'ABC'.EqI:ss] = ['ABC'.EqI_b i (l-1):opt ss]
+ opt ['ABC'.Push_b l:'ABC'.PushI i:'ABC'.EqI:ss] = ['ABC'.EqI_b i l :opt ss]
+ opt ['ABC'.PushI i:'ABC'.Update_b 0 l:'ABC'.Pop_b n:ss] | l == n = ['ABC'.Pop_b n:'ABC'.PushI i:opt ss]
+ opt [s:ss] = [s:opt ss]
+ opt [] = []
+
+ isUseful :: 'ABC'.Statement -> Bool
+ isUseful ('ABC'.Pop_a 0) = False
+ isUseful ('ABC'.Pop_b 0) = False
+ isUseful ('ABC'.Update_a i j) = i <> j
+ isUseful ('ABC'.Update_b i j) = i <> j
+ isUseful ('ABC'.Comment _) = False
+ isUseful _ = True
:: Address :== Int