1 (* Copyright (C) 2011 Matthew Fluet.
2 * Copyright (C) 1999-2005 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
10 functor DeadCode (S: DEAD_CODE_STRUCTS): DEAD_CODE =
19 val {get = varIsUsed, set = setVarIsUsed, destroy, ...} =
20 Property.destGetSet (Var.plist, Property.initConst false)
21 fun patVarIsUsed (p: Pat.t): bool =
24 (Pat.foreachVar (p, fn x => if varIsUsed x
28 fun decIsWildOrUnit (d: Dec.t): bool =
30 Val {rvbs, vbs, ...} =>
31 0 = Vector.length rvbs
32 andalso 1 = Vector.length vbs
34 val pat = #pat (Vector.first vbs)
36 Pat.isWild pat orelse Pat.isUnit pat
39 fun decIsNeeded (d: Dec.t): bool =
43 | Fun {decs, ...} => Vector.exists (decs, varIsUsed o #var)
44 | Val {rvbs, vbs, ...} =>
45 Vector.exists (rvbs, varIsUsed o #var)
46 orelse Vector.exists (vbs, patVarIsUsed o #pat)
47 fun useVar x = setVarIsUsed (x, true)
48 fun useExp (e: Exp.t): unit = Exp.foreachVar (e, useVar)
49 fun useLambda (l: Lambda.t): unit =
50 useExp (#body (Lambda.dest l))
51 fun useDec (d: Dec.t): unit =
55 | Fun {decs, ...} => Vector.foreach (decs, useLambda o #lambda)
56 | Val {rvbs, vbs, ...} =>
57 (Vector.foreach (rvbs, useLambda o #lambda)
58 ; Vector.foreach (vbs, useExp o #exp))
60 val n = Vector.length prog
65 let val (decs, deadCode) = Vector.sub (prog, m - i)
68 then List.fold (rev decs, [], fn (dec, decs) =>
69 if decIsWildOrUnit dec orelse decIsNeeded dec
70 then (useDec dec; dec :: decs)
72 else (List.foreach (decs, useDec)
76 in {prog = Vector.rev prog}