on master help sign in
javascript: recursive optimizer
5389c3braichoo
src/IRTS/CodegenJavaScript.hs+51−15
@@ -243,37 +243,76 @@ jsSubst var new (JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
243 JSReturn $ JSApp fun (map (jsSubst var new) args)
243 JSReturn $ JSApp fun (map (jsSubst var new) args)
244 )]
244 )]
245
245
246+jsSubst var new (JSApp (JSFunction [arg] body) vals)
247+ | var /= arg =
248+ JSApp (JSFunction [arg] (
249+ jsSubst var new body
250+ )) $ map (jsSubst var new) vals
251+
252+jsSubst var new (JSReturn ret) =
253+ JSReturn $ jsSubst var new ret
254+
246jsSubst _ _ js = js
255jsSubst _ _ js = js
247
256
257+inlineAble :: JS -> Bool
258+inlineAble (JSNew con [tag, args]) = True
259+inlineAble (JSApp (JSRaw "__IDRRT__tailcall") _) = False
260+inlineAble JSNull = True
261+inlineAble (JSString _) = True
262+inlineAble (JSType _) = True
263+inlineAble (JSNum _) = True
264+inlineAble (JSApp (JSRaw "__IDRRT__bigInt") _) = True
265+inlineAble _ = False
266+
248optimizeJS :: JS -> JS
267optimizeJS :: JS -> JS
249optimizeJS (JSApp (JSFunction [] (JSSeq ret)) []) =
268optimizeJS (JSApp (JSFunction [] (JSSeq ret)) []) =
250 JSApp (JSFunction [] (JSSeq (map optimizeJS ret))) []
269 JSApp (JSFunction [] (JSSeq (map optimizeJS ret))) []
251
270
252optimizeJS (JSApp (JSFunction [arg] (JSReturn ret)) [val])
271optimizeJS (JSApp (JSFunction [arg] (JSReturn ret)) [val])
253− | JSNew con [tag, vals] <- ret =
272+ | JSNew con [tag, vals] <- ret
273+ , opt <- optimizeJS val
274+ , inlineAble opt =
254− JSNew con [tag, jsSubst arg (optimizeJS val) vals]
275+ JSNew con [tag, jsSubst arg opt vals]
255−
276+
256− | JSNew con [JSFunction [] (JSReturn (JSApp fun vars))] <- ret =
277+ | JSNew con [JSFunction [] (JSReturn (JSApp fun vars))] <- ret
278+ , opt <- optimizeJS val
279+ , inlineAble opt =
257 JSNew con [JSFunction [] (
280 JSNew con [JSFunction [] (
258− JSReturn $ JSApp fun (map (jsSubst arg (optimizeJS val)) vars)
281+ JSReturn $ JSApp fun (map (jsSubst arg opt) vars)
259 )]
282 )]
260
283
261 | JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
284 | JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
262 JSReturn (JSApp fun args)
285 JSReturn (JSApp fun args)
263− )] <- ret =
286+ )] <- ret
287+ , opt <- optimizeJS val
288+ , inlineAble opt =
264 JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
289 JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
265− JSReturn $ JSApp fun (map (jsSubst arg (optimizeJS val)) args)
290+ JSReturn $ JSApp fun (map (jsSubst arg opt) args)
266 )]
291 )]
267
292
293+ | JSApp (JSFunction [x] (JSReturn body)) [y] <- ret
294+ , opt <- optimizeJS val
295+ , inlineAble opt =
296+ optimizeJS (
297+ JSApp (JSFunction [x] $
298+ JSReturn $ jsSubst arg opt (optimizeJS body)
299+ ) [y]
300+ )
301+
302+ | JSIndex (JSProj obj field) idx <- ret
303+ , opt <- optimizeJS val =
304+ JSIndex (JSProj (
305+ jsSubst arg opt obj
306+ ) field
307+ ) (jsSubst arg opt idx)
308+
268 | JSOp op lhs rhs <- ret =
309 | JSOp op lhs rhs <- ret =
269 JSOp op (jsSubst arg (optimizeJS val) lhs) $
310 JSOp op (jsSubst arg (optimizeJS val) lhs) $
270 (jsSubst arg (optimizeJS val) rhs)
311 (jsSubst arg (optimizeJS val) rhs)
271
312
272− | JSIndex (JSProj obj field) idx <- ret =
313+
273− JSIndex (JSProj (
314+optimizeJS (JSApp fun args) =
274− jsSubst arg (optimizeJS val) obj
315+ JSApp (optimizeJS fun) (map optimizeJS args)
275− ) field
276− ) (jsSubst arg (optimizeJS val) idx)
277
316
278optimizeJS (JSAssign lhs rhs) =
317optimizeJS (JSAssign lhs rhs) =
279 JSAssign lhs (optimizeJS rhs)
318 JSAssign lhs (optimizeJS rhs)
@@ -287,9 +326,6 @@ optimizeJS (JSFunction args body) =
287optimizeJS (JSProj (JSFunction args body) "apply") =
326optimizeJS (JSProj (JSFunction args body) "apply") =
288 JSProj (JSFunction args (optimizeJS body)) "apply"
327 JSProj (JSFunction args (optimizeJS body)) "apply"
289
328
290−optimizeJS (JSApp fun args) =
291− JSApp (optimizeJS fun) (map optimizeJS args)
292−
293optimizeJS (JSReturn js) =
329optimizeJS (JSReturn js) =
294 JSReturn $ optimizeJS js
330 JSReturn $ optimizeJS js
295
331