never executed always true always false
1 module HelVM.HelMA.Automaton.Optimizer.ConstantFoldingOptimizer
2 ( constantFolding
3 ) where
4
5 import HelVM.HelMA.Automaton.Combiner.ALU
6
7 import HelVM.HelMA.Automaton.Instruction
8
9 import HelVM.HelMA.Automaton.Instruction.Extras.Constructors
10 import HelVM.HelMA.Automaton.Instruction.Groups.SMInstruction
11
12 import qualified Data.Sequences as S
13
14 constantFolding ∷ InstructionList → InstructionList
15 constantFolding = constantFoldingWithAcc []
16
17 constantFoldingWithAcc ∷ [Integer] → InstructionList → InstructionList
18 constantFoldingWithAcc acc (i : il) = constantFoldingForI acc il i
19 constantFoldingWithAcc acc [] = generateIL acc
20
21 constantFoldingForI ∷ [Integer] → InstructionList → Instruction → InstructionList
22 constantFoldingForI acc il i@(ISM (SPure i')) = constantFoldingForResult il i acc $ runSAL i' acc
23 constantFoldingForI acc il i = generateIL acc <> (i : constantFolding il)
24
25 constantFoldingForResult ∷ InstructionList → Instruction → [Integer] → Either a [Integer] → InstructionList
26 constantFoldingForResult il _ _ (Right acc) = constantFoldingWithAcc acc il
27 constantFoldingForResult il i acc (Left _ ) = generateIL acc <> (i : constantFolding il)
28
29 generateIL ∷ [Integer] → InstructionList
30 generateIL acc = consI <$> S.reverse acc