From e2d36038902ca68dfee3bd59fcdea23d4dc70cb4 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Mon, 2 Mar 2020 20:00:52 +0300 Subject: [PATCH] [devirtualization] Used hash set to handle multi-edges --- .../konan/optimizations/Devirtualization.kt | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt index 1ba318a3d8f..da86d3cbede 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/optimizations/Devirtualization.kt @@ -120,8 +120,26 @@ internal object Devirtualization { private val symbolTable = moduleDFG.symbolTable + // TODO: Make custom hashtable. + class IntHashSet : Iterable { + private val hashSet = HashSet() + val size get() = hashSet.size + fun isEmpty() = size == 0 + fun add(x: Int) = hashSet.add(x) + + override operator fun iterator(): Iterator = Itr() + + private inner class Itr : Iterator { + private val itr = hashSet.iterator() + override fun hasNext() = itr.hasNext() + + override fun next() = itr.next() + + } + } + sealed class Node(val id: Int) { - var directEdges: IntArrayList? = null + var directEdges: IntHashSet? = null var reversedEdges: IntArrayList? = null var directCastEdges: MutableList? = null @@ -137,10 +155,11 @@ internal object Devirtualization { val multiNodeSize get() = multiNodeEnd - multiNodeStart fun addEdge(node: Node) { - if (directEdges == null) directEdges = IntArrayList() - node.directEdges!!.add(node.id) - if (node.reversedEdges == null) node.reversedEdges = IntArrayList() - node.reversedEdges!!.add(id) + if (directEdges == null) directEdges = IntHashSet() + if (directEdges!!.add(node.id)) { + if (node.reversedEdges == null) node.reversedEdges = IntArrayList() + node.reversedEdges!!.add(id) + } } fun addCastEdge(edge: CastEdge) {