@@ -14,6 +14,7 @@ data Endianness = Native | BE | LE deriving (Show, Eq)
1414data LVar = Loc Int | Glob Name
1515 deriving (Show, Eq)
1616
17+-- ASSUMPTION: All variable bindings have unique names here
1718data LExp = LV LVar
1819 | LApp Bool LExp [LExp] -- True = tail call
1920 | LLazyApp Name [LExp] -- True = tail call
@@ -217,57 +218,56 @@ nextN = do i <- get
217218doInline :: LDefs -> LDecl -> LDecl
218219doInline defs d@(LConstructor _ _ _) = d
219220doInline defs (LFun opts topn args exp)
220− = let res = evalState (inlineWith (map (\n -> (n, LV (Glob n))) args) exp) 0 in
221+ = let res = evalState (inlineWith [topn] (map (\n -> (n, LV (Glob n))) args) exp) 0 in
221222 LFun opts topn args res
222223 where
223− inlineWith :: [(Name, LExp)] -> LExp -> State Int LExp
224− inlineWith env var@(LV (Glob n)) = case lookup n env of
224+ inlineWith :: [Name] -> [(Name, LExp)] -> LExp -> State Int LExp
225+ inlineWith done env var@(LV (Glob n))
226+ = case lookup n env of
225227 Just t -> return t
226228 Nothing -> return var
227− inlineWith env (LLazyApp n es) = LLazyApp n <$> (mapM (inlineWith env) es)
228− inlineWith env (LForce e) = LForce <$> inlineWith env e
229− inlineWith env (LLazyExp e) = LLazyExp <$> inlineWith env e
229+ inlineWith done env (LLazyApp n es) = LLazyApp n <$> (mapM (inlineWith done env) es)
230+ inlineWith done env (LForce e) = LForce <$> inlineWith done env e
231+ inlineWith done env (LLazyExp e) = LLazyExp <$> inlineWith done env e
230232 -- Extend the environment for Let and Lam so that bound names aren't
231233 -- expanded with any top level argument definitions they shadow
232− inlineWith env (LLet n val sc)
234+ inlineWith done env (LLet n val sc)
233235 = do n' <- nextN
234− LLet n' <$> inlineWith env val <*>
235− inlineWith ((n, LV (Glob n')) : env) sc
236− inlineWith env (LLam args sc)
236+ LLet n' <$> inlineWith done env val <*>
237+ inlineWith done ((n, LV (Glob n')) : env) sc
238+ inlineWith done env (LLam args sc)
237239 = do ns' <- mapM (\n -> do n' <- nextN
238240 return (n, n')) args
239241 LLam (map snd ns') <$>
240− inlineWith (map (\ (n,n') -> (n, LV (Glob n'))) ns' ++ env) sc
241− inlineWith env (LProj exp i) = LProj <$> inlineWith env exp <*> return i
242− inlineWith env (LCon loc i n es)
243− = LCon loc i n <$> mapM (inlineWith env) es
244− inlineWith env (LCase ty e alts)
245− = LCase ty <$> inlineWith env e <*> mapM (inlineWithAlt env) alts
246− inlineWith env (LOp f es) = LOp f <$> mapM (inlineWith env) es
242+ inlineWith done (map (\ (n,n') -> (n, LV (Glob n'))) ns' ++ env) sc
243+ inlineWith done env (LProj exp i) = LProj <$> inlineWith done env exp <*> return i
244+ inlineWith done env (LCon loc i n es)
245+ = LCon loc i n <$> mapM (inlineWith done env) es
246+ inlineWith done env (LCase ty e alts)
247+ = LCase ty <$> inlineWith done env e <*> mapM (inlineWithAlt done env) alts
248+ inlineWith done env (LOp f es) = LOp f <$> mapM (inlineWith done env) es
247249 -- the interesting case!
248− inlineWith env (LApp t (LV (Glob n)) es)
249− | [LFun opts _ args body] <- lookupCtxt n defs,
250+ inlineWith done env (LApp t (LV (Glob n)) es)
251+ | n `notElem` done,
252+ [LFun opts _ args body] <- lookupCtxt n defs,
250253 Inline `elem` opts,
251254 length es == length args
252− = do es' <- mapM (inlineWith env) es
253− inlineWith (zip args es' ++ env) body
254−-- inlineWith
255−-- -- inlineWith env
256−-- (substLExp (zip args es) body)
257− inlineWith env (LApp t f es)
258− = LApp t <$> inlineWith env f <*> mapM (inlineWith env) es
259− inlineWith env (LForeign l t s args)
260− = LForeign l t s <$> mapM (\(t, e) -> do e' <- inlineWith env e
255+ = do es' <- mapM (inlineWith done env) es
256+ inlineWith (n : done) (zip args es' ++ env) body
257+ inlineWith done env (LApp t f es)
258+ = LApp t <$> inlineWith done env f <*> mapM (inlineWith done env) es
259+ inlineWith done env (LForeign l t s args)
260+ = LForeign l t s <$> mapM (\(t, e) -> do e' <- inlineWith done env e
261261 return (t, e')) args
262− inlineWith env t = return t
262+ inlineWith done env t = return t
263263
264− inlineWithAlt env (LConCase i n es rhs)
264+ inlineWithAlt done env (LConCase i n es rhs)
265265 = do ns' <- mapM (\n -> do n' <- nextN
266266 return (n, n')) es
267267 LConCase i n (map snd ns') <$>
268− inlineWith (map (\ (n,n') -> (n, LV (Glob n'))) ns' ++ env) rhs
269− inlineWithAlt env (LConstCase c e) = LConstCase c <$> inlineWith env e
270− inlineWithAlt env (LDefaultCase e) = LDefaultCase <$> inlineWith env e
268+ inlineWith done (map (\ (n,n') -> (n, LV (Glob n'))) ns' ++ env) rhs
269+ inlineWithAlt done env (LConstCase c e) = LConstCase c <$> inlineWith done env e
270+ inlineWithAlt done env (LDefaultCase e) = LDefaultCase <$> inlineWith done env e
271271
272272-- substLExp :: [(Name, LExp)] -> LExp -> LExp
273273-- substLExp env (LV (Glob n)) | Just t <- lookup n env = t