git » blacktide.git » master » tree

[master] / src / com / tailrecursion / blacktide / compiler / passes / feasible.clj

(ns ^:typed.clojure com.tailrecursion.blacktide.compiler.passes.feasible
  "Fold literal truth tests after source validation. Keep every block so dead
  source still receives JVM validation."
  (:require [com.tailrecursion.nanopass :as np]
            [com.tailrecursion.blacktide.compiler.languages :as l]))

(np/defpass terminator {:from [l/CFG Term] :to [l/CFG Term] :body true}
  [term]
  (if (and (= :branch (:op term)) (= :literal (:op (:test term))))
    {:op :jump :target (if (:value (:test term)) (:yes term) (:no term))}
    term))

(np/defpass block {:from [l/CFG Block] :to [l/CFG Block] :body true}
  [block] (assoc block :term (terminator (:term block))))

(np/defpass program {:from [l/CFG Program] :to [l/CFG Program] :body true}
  [program]
  (update program :blocks update-vals block))