JVM_IR generate range-based loop closer to Java counter loop

KT-48435 KT-48507
This commit is contained in:
Dmitry Petrov
2021-09-01 15:31:19 +03:00
parent 9ed08438d5
commit b669de1663
137 changed files with 1518 additions and 573 deletions
@@ -1,5 +1,17 @@
// IMPORTANT!
// Please, when your changes cause failures in bytecodeText tests for 'for' loops,
// examine the resulting bytecode shape carefully.
// Range and progression-based loops generated with Kotlin compiler should be
// as close as possible to Java counter loops ('for (int i = a; i < b; ++i) { ... }').
// Otherwise it may result in performance regression due to missing HotSpot optimizations.
// Run Kotlin compiler benchmarks (https://github.com/Kotlin/kotlin-benchmarks)
// with compiler built from your changes if you are not sure.
fun consume(i: Int) {}
fun f(r: IntRange) {
for (i in r) {
consume(i)
}
}
@@ -8,4 +20,11 @@ fun f(r: IntRange) {
// 0 getEnd
// 1 getFirst
// 1 getLast
// 0 getStep
// 0 getStep
// 2 ISTORE
// 5 ILOAD
// 1 IINC
// 1 IF_ICMPGT
// 1 IF_ICMPEQ
// 2 IF