All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scala.scalanative.optimizer.analysis.DominatorTree.scala Maven / Gradle / Ivy

The newest version!
package scala.scalanative
package optimizer
package analysis

import scala.collection.immutable
import scala.collection.mutable
import ControlFlow.Block

object DominatorTree {

  /** Fixpoint-based method to build the dominator tree
   *  from the CFG. The dominator tree is simply represented
   *  as a Map from a CFG block to the set of blocks dominating
   *  this block.
   */
  def build(cfg: ControlFlow.Graph): Map[Block, Set[Block]] = {
    val domination = mutable.HashMap.empty[Block, Set[Block]]
    var workList   = immutable.Queue(cfg.entry)

    while (workList.nonEmpty) {
      val (block, dequeued) = workList.dequeue
      workList = dequeued.filterNot(_ == block) // remove duplicates

      val visitedPreds = block.pred.filter(domination.contains)
      val predDomination =
        visitedPreds.toList.map(pred => domination.getOrElse(pred, Set.empty))
      val correctPredDomination = predDomination.filterNot(
        predDominators =>
          predDominators
            .contains(block)) // removes the potential dominators that are dominated by this block (counters loop problems)

      val blockDomination =
        if (correctPredDomination.isEmpty)
          Set.empty[Block]
        else
          correctPredDomination.tail.foldLeft(correctPredDomination.head)(
            (a, b) => a.intersect(b))

      val oldDomination = domination.getOrElse(block, Set.empty)
      val newDomination = blockDomination + block // a block dominates itself

      if (oldDomination != newDomination) {
        domination += (block -> newDomination)
        workList ++= block.succ
      }
    }

    domination.toMap
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy