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

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

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

import scala.collection.mutable
import scala.annotation.tailrec
import analysis.ClassHierarchy.Top
import util.ScopedVar, ScopedVar.scoped
import nir._, Inst.Let

/** Propagates all copies down the use chain.
 *
 *  For example:
 *
 *      %foo = copy 1i32
 *      %bar = copy %foo
 *      %baz = iadd[i32] %bar, 2i32
 *
 *  Becomes:
 *
 *      %baz = iadd[i32] 1i32, 2i32
 */
class CopyPropagation extends Pass {
  private var locals: mutable.Map[Local, Val] = _

  private def collect(insts: Seq[Inst]): mutable.Map[Local, Val] = {
    val copies = mutable.Map.empty[Local, Val]

    insts.foreach {
      case Let(n, Op.Copy(v)) =>
        copies(n) = v
      case inst =>
        ()
    }

    copies
  }

  override def onInsts(insts: Seq[Inst]): Seq[Inst] = {
    val buf = new nir.Buffer
    locals = collect(insts)
    insts.foreach {
      case Let(_, _: Op.Copy) =>
        ()
      case inst =>
        buf += super.onInst(inst)
    }
    buf.toSeq
  }

  override def onVal(value: Val) = value match {
    case value: Val.Local =>
      @tailrec
      def loop(value: Val): Val =
        value match {
          case Val.Local(local, _) if locals.contains(local) =>
            loop(locals(local))

          case value =>
            value
        }
      loop(value)

    case _ =>
      super.onVal(value)
  }
}

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




© 2015 - 2025 Weber Informatics LLC | Privacy Policy