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

scala.scalanative.optimizer.pass.DeadCodeElimination.scala Maven / Gradle / Ivy

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

import scala.collection.mutable
import analysis.ClassHierarchy.Top
import analysis.UseDef
import analysis.ControlFlow
import nir._

/** Eliminates pure computations that are not being used, as well as unused block parameters. */
class DeadCodeElimination(implicit top: Top) extends Pass {
  import DeadCodeElimination._

  override def onInsts(insts: Seq[Inst]): Seq[Inst] = {
    val cfg        = ControlFlow.Graph(insts)
    val usedef     = UseDef(cfg)
    val removeArgs = new ArgRemover(usedef, cfg.entry.name)
    val buf        = new nir.Buffer

    cfg.all.foreach { block =>
      if (usedef(block.name).alive) {
        val newParams = block.params.filter { p =>
          (block.name == cfg.entry.name) || usedef(p.name).alive
        }
        buf += block.label.copy(params = newParams)
        block.insts.foreach {
          case inst @ Inst.Let(n, op) =>
            if (usedef(n).alive) buf += inst
          case inst: Inst.Cf =>
            buf += removeArgs.onInst(inst)
          case _ =>
            ()
        }
      }
    }

    buf.toSeq
  }
}

object DeadCodeElimination extends PassCompanion {
  override def apply(config: tools.Config, top: Top) =
    new DeadCodeElimination()(top)

  class ArgRemover(usedef: Map[Local, UseDef.Def], entryName: Local)
      extends Pass {
    override def onNext(next: Next) = next match {
      case Next.Label(name, args) if (name != entryName) =>
        usedef(name) match {
          case UseDef.BlockDef(_, _, _, params) =>
            val newArgs = args.zip(params).collect {
              case (arg, param) if param.alive => arg
            }
            Next.Label(name, newArgs)

          case _ =>
            throw new IllegalStateException(
              s"Expected a BlockDef in usedef for ${name.show}")
        }

      case _ =>
        next
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy