diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions/Instruction.kt b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions/Instruction.kt index e98ff49cdb0..ea2df5fbe4e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions/Instruction.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions/Instruction.kt @@ -23,7 +23,7 @@ import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue public trait Instruction { public var owner: Pseudocode - public val previousInstructions: MutableCollection + public val previousInstructions: Collection public val nextInstructions: Collection public val dead: Boolean @@ -32,7 +32,7 @@ public trait Instruction { public val inputValues: List - public fun getCopies(): Collection + public val copies: Collection public fun accept(visitor: InstructionVisitor) public fun accept(visitor: InstructionVisitorWithResult): R diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions/InstructionImpl.kt b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions/InstructionImpl.kt index 45b4cb11df0..3318a932b83 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions/InstructionImpl.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/instructions/InstructionImpl.kt @@ -33,46 +33,32 @@ public abstract class InstructionImpl(public override val lexicalScope: LexicalS _owner = value } - private val _copies = HashSet() + private var allCopies: MutableSet? = null - override fun getCopies(): Collection { - return original?.let { original -> - val originalCopies = Sets.newHashSet(original.getCopies()) - originalCopies.remove(this) - originalCopies.add(original) - originalCopies - } ?: _copies - } + override val copies: Collection + get() = allCopies?.filter { it != this } ?: Collections.emptyList() - private var original: Instruction? = null - - private fun setOriginalInstruction(value: Instruction?) { - assert(original == null) { "Instruction can't have two originals: this.original = ${original}; new original = $this" } - original = value - } - - public fun copy(): Instruction { - return updateCopyInfo(createCopy()) - } + fun copy(): Instruction = updateCopyInfo(createCopy()) protected abstract fun createCopy(): InstructionImpl protected fun updateCopyInfo(instruction: InstructionImpl): Instruction { - _copies.add(instruction) - instruction.setOriginalInstruction(this) + if (allCopies == null) { + allCopies = hashSetOf(this) + } + instruction.allCopies = allCopies + allCopies!!.add(instruction) return instruction } public var markedAsDead: Boolean = false - override val dead: Boolean get() = markedAsDead && getCopies().all { (it as InstructionImpl).markedAsDead } + override val dead: Boolean get() = allCopies?.all { it.markedAsDead } ?: markedAsDead override val previousInstructions: MutableCollection = LinkedHashSet() protected fun outgoingEdgeTo(target: Instruction?): Instruction? { - if (target != null) { - target.previousInstructions.add(this) - } + (target as InstructionImpl?)?.previousInstructions?.add(this) return target }