@@ -22,6 +22,7 @@ import IR ( Identifier(..)
2222import qualified Data.List
2323import qualified Data.Ord
2424
25+ import Debug.Trace
2526--------------------------------------------------
2627-- substitutions for Raw
2728--------------------------------------------------
@@ -300,7 +301,7 @@ pevalInst i = do
300301 markUsed v
301302 let m0 = stateLVals pstate
302303 let m1 = Map. insert (v, field) r m0
303- put $ pstate { stateLVals = m1 }
304+ put $ pstate { stateLVals = m1 }
304305 AssignRaw r rexpr -> _keep $ do
305306 markUsed rexpr
306307 case guessType rexpr of
@@ -489,7 +490,23 @@ instance PEval RawBBTree where
489490funopt :: FunDef -> FunDef
490491funopt (FunDef hfn consts bb ir) =
491492
492- let constTypes = foldl (\ m (x, lit) ->
493+ let
494+ (m_consts, m_subst) = foldl (\ (m1, m2) (x,lit) ->
495+ case Map. lookup lit m1 of
496+ Just r -> (m1, Map. insert x r m2 )
497+ Nothing -> (Map. insert lit x m1, m2 )
498+ ) (Map. empty, Map. empty) consts
499+
500+ (consts', constTypes) = Map. foldrWithKey (\ lit x (acc,m) ->
501+ let new_acc = (x, lit) : acc
502+ new_m = case typeOfLit lit of
503+ Just t -> Map. insert x t m
504+ Nothing -> m
505+ in (new_acc, new_m))
506+ ([] ,Map. empty)
507+ m_consts
508+
509+ constTypes_obs = foldl (\ m (x, lit) ->
493510 case typeOfLit lit of
494511 Just t -> Map. insert x t m
495512 Nothing -> m
@@ -498,12 +515,12 @@ funopt (FunDef hfn consts bb ir) =
498515 pstate = PState {stateMon = Map. empty,
499516 stateLVals = Map. empty,
500517 stateJoins = Map. empty,
501- stateSubst = Subst (Map. empty ),
518+ stateSubst = Subst (m_subst ),
502519 stateChange = False ,
503520 stateTypes = constTypes
504521 }
505522 (bb', _, _) = runRWS (peval bb) () pstate
506- new = FunDef hfn consts bb' ir
523+ new = FunDef hfn consts' bb' ir
507524 in if bb /= bb' then funopt new else new
508525
509526
0 commit comments