Use while loop for progressions that cannot overflow (instead of

do-while with enclosing "not empty" check).

Also do not add additional "not empty" condition for `until` loops when
the given bound is a constant != MIN_VALUE.
This commit is contained in:
Mark Punzalan
2019-03-29 10:33:30 -07:00
committed by max-kammerer
parent ba0e016c4e
commit 7680e7fd56
25 changed files with 403 additions and 94 deletions
@@ -0,0 +1,14 @@
const val M = Char.MIN_VALUE
fun f(a: Char) {
for (i in a downTo M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF
@@ -0,0 +1,14 @@
const val M = Int.MIN_VALUE
fun f(a: Int) {
for (i in a downTo M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMP
@@ -0,0 +1,15 @@
const val M = Long.MIN_VALUE
fun f(a: Long) {
for (i in a downTo M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 LCMP
// 2 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test() {
var sum = 0
for (i in arrayOf("", "", "", "").indices) {
@@ -12,6 +11,4 @@ fun test() {
// 0 getFirst
// 0 getLast
// 0 IF_ICMPGT
// 0 IF_ICMPEQ
// 1 IF_ICMPGE
// 1 IF_ICMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test() {
var sum = 0
for (i in intArrayOf(0, 0, 0, 0).indices) {
@@ -12,6 +11,4 @@ fun test() {
// 0 getFirst
// 0 getLast
// 0 IF_ICMPGT
// 0 IF_ICMPEQ
// 1 IF_ICMPGE
// 1 IF_ICMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val N = 'Z'
fun test(): Int {
@@ -9,5 +8,10 @@ fun test(): Int {
return sum
}
// 0 IF_ICMPEQ
// 1 IF_ICMPGT
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMP
@@ -0,0 +1,14 @@
const val M = Char.MAX_VALUE
fun f(a: Char) {
for (i in a..M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val N = 42
fun test(): Int {
@@ -9,5 +8,10 @@ fun test(): Int {
return sum
}
// 0 IF_ICMPEQ
// 1 IF_ICMPGT
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMP
@@ -0,0 +1,14 @@
const val M = Int.MAX_VALUE
fun f(a: Int) {
for (i in a..M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val N = 42L
fun test(): Long {
@@ -9,6 +8,14 @@ fun test(): Long {
return sum
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 LCMP
// 0 IFEQ
// 1 IFGT
// 1 IFGT
// 0 L2I
// 0 I2L
@@ -0,0 +1,15 @@
const val M = Long.MAX_VALUE
fun f(a: Long) {
for (i in a..M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 LCMP
// 2 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
object Host {
const val M = 1
const val N = 4
@@ -12,5 +11,10 @@ fun test(): Int {
return s
}
// 0 IF_ICMPEQ
// 1 IF_ICMPGT
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMP
@@ -11,4 +11,5 @@ fun test(): Int {
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 0 getStep
// 1 IF_ICMP
@@ -0,0 +1,14 @@
const val M = Char.MAX_VALUE
fun f(a: Char) {
for (i in a until M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMP
@@ -0,0 +1,14 @@
const val M = Int.MAX_VALUE
fun f(a: Int) {
for (i in a until M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMP
@@ -0,0 +1,15 @@
const val M = Long.MAX_VALUE
fun f(a: Long) {
for (i in a until M) {
}
}
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 LCMP
// 1 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test(): Int {
var sum = 0
for (i in 4 downTo 1) {
@@ -12,5 +11,4 @@ fun test(): Int {
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 IF_ICMPEQ
// 1 IF_ICMPLT
// 1 IF_ICMP
@@ -8,4 +8,5 @@ fun f() {
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 0 getStep
// 1 IF_ICMP
@@ -8,4 +8,5 @@ fun f(a: Int, b: Int) {
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 0 getStep
// 2 IF_ICMP