Packages

abstract class CopyProp extends AnyRef

Source
CopyProp.scala
Linear Supertypes
AnyRef, Any
Type Hierarchy
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. CopyProp
  2. AnyRef
  3. Any
Implicitly
  1. by any2stringadd
  2. by StringFormat
  3. by Ensuring
  4. by ArrowAssoc
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Instance Constructors

  1. new CopyProp()

Type Members

  1. case class ProducedValue(producer: AbstractInsnNode, size: Int) extends Product with Serializable

Abstract Value Members

  1. abstract val postProcessor: PostProcessor

Concrete Value Members

  1. final def !=(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int
    Definition Classes
    AnyRef → Any
  3. def +(other: String): String
    Implicit
    This member is added by an implicit conversion from CopyProp to any2stringadd[CopyProp] performed by method any2stringadd in scala.Predef.
    Definition Classes
    any2stringadd
  4. def ->[B](y: B): (CopyProp, B)
    Implicit
    This member is added by an implicit conversion from CopyProp to ArrowAssoc[CopyProp] performed by method ArrowAssoc in scala.Predef.
    Definition Classes
    ArrowAssoc
    Annotations
    @inline()
  5. final def ==(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  6. final def asInstanceOf[T0]: T0
    Definition Classes
    Any
  7. def clone(): AnyRef
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @native() @throws( ... )
  8. def copyPropagation(method: MethodNode, owner: InternalName): Boolean

    For every xLOAD n, find all local variable slots that are aliases of n using an AliasingAnalyzer and change the instruction to xLOAD m where m is the smallest alias.

    For every xLOAD n, find all local variable slots that are aliases of n using an AliasingAnalyzer and change the instruction to xLOAD m where m is the smallest alias. This leaves behind potentially stale xSTORE n instructions, which are then eliminated by eliminateStaleStores.

  9. def eliminatePushPop(method: MethodNode, owner: InternalName): Boolean

    When a POP instruction has a single producer, remove the POP and eliminate the producer by bubbling up the POPs.

    When a POP instruction has a single producer, remove the POP and eliminate the producer by bubbling up the POPs. For example, given ILOAD 1; ILOAD 2; IADD; POP we first eliminate the POP, then the IADD, then its inputs, so the entire sequence goes away. If a producer cannot be eliminated (need to keep side-effects), a POP is inserted.

    A special case eliminates the creation of unused objects with side-effect-free constructors: NEW scala/Tuple1; DUP; ALOAD 0; INVOKESPECIAL scala/Tuple1.<init>; POP The POP has a single producer (the DUP), it's easy to eliminate these two. A special case is needed to eliminate the INVOKESPECIAL and NEW.

  10. def eliminateStaleStores(method: MethodNode, owner: InternalName): Boolean

    Eliminate xSTORE instructions that have no consumer.

    Eliminate xSTORE instructions that have no consumer. If the instruction can be completely eliminated, it is replaced by a POP. The eliminatePushPop cleans up unnecessary POPs.

    Note that an ASOTRE can not always be eliminated: it removes a reference to the object that is currently stored in that local, which potentially frees it for GC (scala/bug#5313). Therefore we replace such stores by POP; ACONST_NULL; ASTORE x.

  11. def eliminateStoreLoad(method: MethodNode): Boolean

    Remove xSTORE n; xLOAD n pairs if

    Remove xSTORE n; xLOAD n pairs if

    • the local variable n is not used anywhere else in the method (1), and
    • there are no executable instructions and no live labels (jump targets) between the two (2)

    Note: store-load pairs that cannot be eliminated could be replaced by DUP; xSTORE n, but that's just cosmetic and doesn't help for anything.

    (1) This could be made more precise by running a prodCons analysis and checking that the load is the only user of the store. Then we could eliminate the pair even if the variable is live (except for ASTORE, scala/bug#5313). Not needing an analyzer is more efficient, and catches most cases.

    (2) The implementation uses a conservative estimation for liveness (if some instruction uses local n, then n is considered live in the entire method). In return, it doesn't need to run an Analyzer on the method, making it more efficient.

    This method also removes ACONST_NULL; ASTORE n if the local n is not live. This pattern is introduced by eliminateStaleStores.

    The implementation is a little tricky to support the following case: ISTORE 1; ISTORE 2; ILOAD 2; ACONST_NULL; ASTORE 3; ILOAD 1 The outer store-load pair can be removed if two the inner pairs can be.

  12. def ensuring(cond: (CopyProp) ⇒ Boolean, msg: ⇒ Any): CopyProp
    Implicit
    This member is added by an implicit conversion from CopyProp to Ensuring[CopyProp] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  13. def ensuring(cond: (CopyProp) ⇒ Boolean): CopyProp
    Implicit
    This member is added by an implicit conversion from CopyProp to Ensuring[CopyProp] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  14. def ensuring(cond: Boolean, msg: ⇒ Any): CopyProp
    Implicit
    This member is added by an implicit conversion from CopyProp to Ensuring[CopyProp] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  15. def ensuring(cond: Boolean): CopyProp
    Implicit
    This member is added by an implicit conversion from CopyProp to Ensuring[CopyProp] performed by method Ensuring in scala.Predef.
    Definition Classes
    Ensuring
  16. final def eq(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  17. def equals(arg0: Any): Boolean
    Definition Classes
    AnyRef → Any
  18. def finalize(): Unit
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  19. def formatted(fmtstr: String): String
    Implicit
    This member is added by an implicit conversion from CopyProp to StringFormat[CopyProp] performed by method StringFormat in scala.Predef.
    Definition Classes
    StringFormat
    Annotations
    @inline()
  20. final def getClass(): Class[_]
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  21. def hashCode(): Int
    Definition Classes
    AnyRef → Any
    Annotations
    @native()
  22. final def isInstanceOf[T0]: Boolean
    Definition Classes
    Any
  23. final def ne(arg0: AnyRef): Boolean
    Definition Classes
    AnyRef
  24. final def notify(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  25. final def notifyAll(): Unit
    Definition Classes
    AnyRef
    Annotations
    @native()
  26. final def synchronized[T0](arg0: ⇒ T0): T0
    Definition Classes
    AnyRef
  27. def toString(): String
    Definition Classes
    AnyRef → Any
  28. final def wait(): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  29. final def wait(arg0: Long, arg1: Int): Unit
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  30. final def wait(arg0: Long): Unit
    Definition Classes
    AnyRef
    Annotations
    @native() @throws( ... )
  31. def [B](y: B): (CopyProp, B)
    Implicit
    This member is added by an implicit conversion from CopyProp to ArrowAssoc[CopyProp] performed by method ArrowAssoc in scala.Predef.
    Definition Classes
    ArrowAssoc

Inherited from AnyRef

Inherited from Any

Inherited by implicit conversion any2stringadd from CopyProp to any2stringadd[CopyProp]

Inherited by implicit conversion StringFormat from CopyProp to StringFormat[CopyProp]

Inherited by implicit conversion Ensuring from CopyProp to Ensuring[CopyProp]

Inherited by implicit conversion ArrowAssoc from CopyProp to ArrowAssoc[CopyProp]

Ungrouped