KT-5075 Optimize array/collection indices usage in 'for' loop

Use specialized 'for' loop code generation strategy for loops over array indices and collection indices.
This commit is contained in:
Dmitry Petrov
2016-06-15 11:11:47 +03:00
parent 3a8591a729
commit a17b0dd1b5
16 changed files with 409 additions and 3 deletions
@@ -0,0 +1,19 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun Collection<Int>.sumIndices(): Int {
var sum = 0
for (i in indices) {
sum += i
}
return sum
}
fun box(): String {
val list = listOf(0, 0, 0, 0)
val sum = list.sumIndices()
assertEquals(6, sum)
return "OK"
}
@@ -0,0 +1,13 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun box(): String {
var sum = 0
for (i in listOf(0, 0, 0, 0).indices) {
sum += i
}
assertEquals(6, sum)
return "OK"
}
@@ -0,0 +1,18 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun sumIndices(coll: Collection<*>?): Int {
var sum = 0
for (i in coll?.indices ?: return 0) {
sum += i
}
return sum
}
fun box(): String {
assertEquals(6, sumIndices(listOf(0, 0, 0, 0)))
assertEquals(0, sumIndices(null))
return "OK"
}
@@ -0,0 +1,13 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun box(): String {
var sum = 0
for (i in arrayOf("", "", "", "").indices) {
sum += i
}
assertEquals(6, sum)
return "OK"
}
@@ -0,0 +1,13 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun box(): String {
var sum = 0
for (i in intArrayOf(0, 0, 0, 0).indices) {
sum += i
}
assertEquals(6, sum)
return "OK"
}
@@ -0,0 +1,16 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun suppressBoxingOptimization(ni: Int?) {}
fun box(): String {
var sum = 0
for (i: Int? in arrayOf("", "", "", "").indices) {
suppressBoxingOptimization(i)
sum += i ?: 0
}
assertEquals(6, sum)
return "OK"
}
@@ -0,0 +1,16 @@
// WITH_RUNTIME
import kotlin.test.assertEquals
fun suppressBoxingOptimization(ni: Int?) {}
fun box(): String {
var sum = 0
for (i: Int? in listOf("", "", "", "").indices) {
suppressBoxingOptimization(i)
sum += i ?: 0
}
assertEquals(6, sum)
return "OK"
}