(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))