diff options
author | Camil Staps | 2017-07-24 18:21:34 +0200 |
---|---|---|
committer | Camil Staps | 2017-07-24 18:21:34 +0200 |
commit | 7d1448c8fa4fe530dbeda92ff3f85bebb33ad75f (patch) | |
tree | bc1b720bff920d3ca705b47cbc5782acdef0eb69 /Sil | |
parent | Update for gcc 6 (diff) |
Optimisations
Diffstat (limited to 'Sil')
-rw-r--r-- | Sil/Compile.icl | 19 |
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 |