0 | module Compiler.Opts.InlineHeuristics
2 | import Core.CompileExpr
3 | import Core.Context.Log
5 | import Libraries.Data.WithDefault
7 | parameters (fn : Name)
8 | isVar : CExp vars -> Bool
9 | isVar (CLocal {}) = True
10 | isVar (CRef {}) = True
11 | isVar (CForce _ _ x) = isVar x
12 | isVar (CDelay _ _ x) = isVar x
15 | simple : CExp vars -> Bool
16 | simple (CLocal {}) = True
17 | simple (CRef {}) = True
18 | simple (CLam {}) = False
19 | simple (CLet {}) = False
20 | simple (CApp _ (CRef _ fn') xs) = not (fn == fn') && all isVar xs
21 | simple (CApp _ fn xs) = isVar fn && all isVar xs
22 | simple (CCon _ _ _ _ xs) = all isVar xs
23 | simple (COp _ _ xs) = all isVar xs
24 | simple (CExtPrim _ _ xs) = all isVar xs
25 | simple (CForce _ _ y) = simple y
26 | simple (CDelay _ _ y) = simple y
27 | simple (CConCase {}) = False
28 | simple (CConstCase {}) = False
29 | simple (CPrimVal {}) = True
30 | simple (CErased {}) = True
31 | simple (CCrash {}) = False
33 | inlineCDef : CDef -> Bool
34 | inlineCDef (MkFun args exp) =
36 | inlineCDef _ = False
39 | inlineHeuristics : Ref Ctxt Defs => Name -> Core ()
40 | inlineHeuristics fn = do
42 | Just (fnIdx, gdef) <- lookupCtxtExactI fn defs.gamma
43 | | Nothing => pure ()
44 | let Just cdef = gdef.compexpr
45 | | Nothing => pure ()
46 | let True = inlineCDef fn cdef
57 | let Public = collapseDefault $
gdef.visibility
59 | unless (NoInline `elem` gdef.flags) $
do
60 | log "compiler.inline.heuristic" 25 $
"inlining heuristic decided to inline: " ++ show fn
61 | setFlag EmptyFC (Resolved fnIdx) Inline