Support target templates in bytecode tests

Avoid test data duplication
This commit is contained in:
Mikhael Bogdanov
2019-07-16 09:15:31 +02:00
parent de1e27c584
commit 496765f41e
46 changed files with 250 additions and 679 deletions
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test() {
var sum = 0
for (i in arrayOf("", "", "", "").indices) {
@@ -1,19 +0,0 @@
// TARGET_BACKEND: JVM_IR
fun test() {
var sum = 0
for (i in arrayOf("", "", "", "").indices) {
sum += i
}
}
// JVM non-IR uses while.
// JVM IR uses if + do-while.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test() {
var sum = 0
for (i in intArrayOf(0, 0, 0, 0).indices) {
@@ -14,5 +13,12 @@ fun test() {
// 0 getEnd
// 0 getFirst
// 0 getLast
// JVM_TEMPLATES
// 1 IF_ICMPGE
// 1 IF
// 1 IF
// JVM_IR_TEMPLATES
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,19 +0,0 @@
// TARGET_BACKEND: JVM_IR
fun test() {
var sum = 0
for (i in intArrayOf(0, 0, 0, 0).indices) {
sum += i
}
}
// JVM non-IR uses while.
// JVM IR uses if + do-while.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val N = 'Z'
fun test(): Int {
@@ -18,5 +17,10 @@ fun test(): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF
// JVM_TEMPLATES
// 1 IF_ICMPGT
// 1 IF
// JVM_IR_TEMPLATES
// 1 IF_ICMPLE
@@ -1,22 +0,0 @@
// TARGET_BACKEND: JVM_IR
const val N = 'Z'
fun test(): Int {
var sum = 0
for (i in 'A' .. N) {
sum += i.toInt()
}
return sum
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition).
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMPLE
// 1 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val N = 42
fun test(): Int {
@@ -18,5 +17,10 @@ fun test(): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF
// JVM_TEMPLATES
// 1 IF_ICMPGT
// 1 IF
// JVM_IR_TEMPLATES
// 1 IF_ICMPLE
@@ -1,22 +0,0 @@
// TARGET_BACKEND: JVM_IR
const val N = 42
fun test(): Int {
var sum = 0
for (i in 1 .. N) {
sum += i
}
return sum
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition).
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMPLE
// 1 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val N = 42L
fun test(): Long {
@@ -18,8 +17,15 @@ fun test(): Long {
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 LCMP
// 1 IFGT
// 1 IF
// 0 L2I
// 0 I2L
// 0 I2L
// JVM_TEMPLATES
// 1 LCMP
// 1 IF
// JVM_IR_TEMPLATES
// 2 LCMP
// 1 IFLE
// 2 IF
@@ -1,26 +0,0 @@
// TARGET_BACKEND: JVM_IR
const val N = 42L
fun test(): Long {
var sum = 0L
for (i in 1L .. N) {
sum += i
}
return sum
}
// JVM non-IR uses while.
// JVM IR uses if + do-while.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 LCMP
// 1 IFGT
// 1 IFLE
// 2 IF
// 0 L2I
// 0 I2L
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
object Host {
const val M = 1
const val N = 4
@@ -21,5 +20,10 @@ fun test(): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF
// JVM_TEMPLATES
// 1 IF_ICMPGT
// 1 IF
// JVM_IR_TEMPLATES
// 1 IF_ICMPLE
@@ -1,25 +0,0 @@
// TARGET_BACKEND: JVM_IR
object Host {
const val M = 1
const val N = 4
}
fun test(): Int {
var s = 0
for (i in Host.M .. Host.N) {
s += i
}
return s
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition).
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMPLE
// 1 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
@@ -22,5 +21,12 @@ fun box(): String {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 1 IFLT
// 1 IF
// 1 IF
// JVM_IR_TEMPLATES
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,27 +0,0 @@
// TARGET_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
val arr = intArrayOf(1, 1, 1, 1)
var sum = 0
for (i in arr.indices.reversed()) {
sum = sum * 10 + i + arr[i]
}
assertEquals(4321, sum)
return "OK"
}
// JVM non-IR uses while.
// JVM IR uses if + do-while.
// 0 reversed
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
@@ -33,7 +32,15 @@ fun box(): String {
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMPGT
// 1 IFGT
// JVM_TEMPLATES
// 2 IF_ICMPGT
// 3 IF
// 1 LCMP
// 1 LCMP
// JVM_IR_TEMPLATES
// 2 IF_ICMPLE
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,40 +0,0 @@
// TARGET_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
var sum = 0
for (i in (4 downTo 1).reversed()) {
sum = sum * 10 + i
}
assertEquals(1234, sum)
var sumL = 0L
for (i in (4L downTo 1L).reversed()) {
sumL = sumL * 10 + i
}
assertEquals(1234L, sumL)
var sumC = 0
for (i in ('4' downTo '1').reversed()) {
sumC = sumC * 10 + i.toInt() - '0'.toInt()
}
assertEquals(1234, sumC)
return "OK"
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition), except for Long.
// 0 reversed
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
@@ -33,7 +32,16 @@ fun box(): String {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 2 IF_ICMPLT
// 1 IFLT
// 3 IF
// 1 LCMP
// 1 LCMP
// JVM_IR_TEMPLATES
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,40 +0,0 @@
// TARGET_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
var sum = 0
for (i in (1 .. 4).reversed()) {
sum = sum * 10 + i
}
assertEquals(4321, sum)
var sumL = 0L
for (i in (1L .. 4L).reversed()) {
sumL = sumL * 10 + i
}
assertEquals(4321L, sumL)
var sumC = 0
for (i in ('1' .. '4').reversed()) {
sumC = sumC * 10 + i.toInt() - '0'.toInt()
}
assertEquals(4321, sumC)
return "OK"
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition), except for Long.
// 0 reversed
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
@@ -33,7 +32,16 @@ fun box(): String {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 2 IF_ICMPLT
// 1 IFLT
// 3 IF
// 1 LCMP
// 1 LCMP
// JVM_IR_TEMPLATES
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,40 +0,0 @@
// TARGET_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
var sum = 0
for (i in (4 downTo 1).reversed().reversed()) {
sum = sum * 10 + i
}
assertEquals(1234, sum)
var sumL = 0L
for (i in (4L downTo 1L).reversed().reversed()) {
sumL = sumL * 10 + i
}
assertEquals(1234L, sumL)
var sumC = 0
for (i in ('4' downTo '1').reversed().reversed()) {
sumC = sumC * 10 + i.toInt() - '0'.toInt()
}
assertEquals(1234, sumC)
return "OK"
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition), except for Long.
// 0 reversed
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
@@ -30,7 +29,16 @@ fun box(): String {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 2 IF_ICMPGE
// 1 IFGE
// 3 IF
// 1 LCMP
// 1 LCMP
// JVM_IR_TEMPLATES
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,37 +0,0 @@
// TARGET_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
var sum = 0
for (i in (1 until 5).reversed().reversed()) {
sum = sum * 10 + i
}
var sumL = 0L
for (i in (1L until 5L).reversed().reversed()) {
sumL = sumL * 10 + i
}
var sumC = 0
for (i in ('1' until '5').reversed().reversed()) {
sumC = sumC * 10 + i.toInt() - '0'.toInt()
}
return "OK"
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition), except for Long.
// 0 reversed
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
@@ -30,7 +29,16 @@ fun box(): String {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 2 IF_ICMPLT
// 1 IFLT
// 3 IF
// 1 LCMP
// 1 LCMP
// JVM_IR_TEMPLATES
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,37 +0,0 @@
// TARGET_BACKEND: JVM_IR
import kotlin.test.*
fun box(): String {
var sum = 0
for (i in (1 until 5).reversed()) {
sum = sum * 10 + i
}
var sumL = 0L
for (i in (1L until 5L).reversed()) {
sumL = sumL * 10 + i
}
var sumC = 0
for (i in ('1' until '5').reversed()) {
sumC = sumC * 10 + i.toInt() - '0'.toInt()
}
return "OK"
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition), except for Long.
// 0 reversed
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 IF_ICMPLE
// 1 IFGT
// 1 IFLE
// 4 IF
// 2 LCMP
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test(a: Char, b: Char): String {
var s = ""
for (i in a until b) {
@@ -16,5 +15,13 @@ fun test(a: Char, b: Char): String {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 1 IF_ICMPGE
// 1 IF
// 1 IF
// JVM_IR_TEMPLATES
// 1 IFEQ
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 3 IF
@@ -1,22 +0,0 @@
// TARGET_BACKEND: JVM_IR
fun test(a: Char, b: Char): String {
var s = ""
for (i in a until b) {
s += i
}
return s
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. In addition, for "until" progressions, there is a check that the range is not empty: upper bound != MIN_VALUE.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IFEQ
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 3 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val M = Char.MAX_VALUE
fun f(a: Char): Int {
@@ -18,5 +17,12 @@ fun f(a: Char): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 1 IF_ICMPGE
// 1 IF
// 1 IF
// JVM_IR_TEMPLATES
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,23 +0,0 @@
// TARGET_BACKEND: JVM_IR
const val M = Char.MAX_VALUE
fun f(a: Char): Int {
var n = 0
for (i in a until M) {
n++
}
return n
}
// JVM non-IR uses while.
// JVM IR uses if + do-while.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,4 +1,3 @@
// TARGET_BACKEND: JVM_IR
const val M = Char.MIN_VALUE
fun f(a: Char): Int {
@@ -18,5 +17,10 @@ fun f(a: Char): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// 0 IF
// 0 LINENUMBER 7
// 0 LINENUMBER 7
// JVM_TEMPLATES
// 1 IF
// JVM_IR_TEMPLATES
// 0 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test(a: Int, b: Int): Int {
var sum = 0
for (i in a until b) {
@@ -16,5 +15,14 @@ fun test(a: Int, b: Int): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 1 IF_ICMPGE
// 1 IF
// 1 IF
// JVM_IR_TEMPLATES
// 1 LDC -2147483648
// 1 IF_ICMPEQ
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 3 IF
@@ -1,23 +0,0 @@
// TARGET_BACKEND: JVM_IR
fun test(a: Int, b: Int): Int {
var sum = 0
for (i in a until b) {
sum = sum * 10 + i
}
return sum
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. In addition, for "until" progressions, there is a check that the range is not empty: upper bound != MIN_VALUE.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 LDC -2147483648
// 1 IF_ICMPEQ
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 3 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val M = Int.MAX_VALUE
fun f(a: Int): Int {
@@ -18,5 +17,12 @@ fun f(a: Int): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 1 IF_ICMPGE
// 1 IF
// 1 IF
// JVM_IR_TEMPLATES
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,23 +0,0 @@
// TARGET_BACKEND: JVM_IR
const val M = Int.MAX_VALUE
fun f(a: Int): Int {
var n = 0
for (i in a until M) {
n++
}
return n
}
// JVM non-IR uses while.
// JVM IR uses if + do-while.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMPGT
// 1 IF_ICMPLE
// 2 IF
@@ -1,4 +1,3 @@
// TARGET_BACKEND: JVM_IR
const val M = Int.MIN_VALUE
fun f(a: Int): Int {
@@ -18,5 +17,10 @@ fun f(a: Int): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// 0 IF
// 0 LINENUMBER 7
// 0 LINENUMBER 7
// JVM_TEMPLATES
// 1 IF
// JVM_IR_TEMPLATES
// 0 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun test(a: Long, b: Long): Long {
var sum = 0L
for (i in a until b) {
@@ -16,6 +15,16 @@ fun test(a: Long, b: Long): Long {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 1 LCMP
// 1 IFGE
// 1 IF
// 1 IF
// JVM_IR_TEMPLATES
// 1 LDC -9223372036854775808
// 3 LCMP
// 1 IFEQ
// 1 IFGT
// 1 IFLE
// 3 IF
@@ -1,24 +0,0 @@
// TARGET_BACKEND: JVM_IR
fun test(a: Long, b: Long): Long {
var sum = 0L
for (i in a until b) {
sum = sum * 10L + i
}
return sum
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. In addition, for "until" progressions, there is a check that the range is not empty: upper bound != MIN_VALUE.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 LDC -9223372036854775808
// 3 LCMP
// 1 IFEQ
// 1 IFGT
// 1 IFLE
// 3 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
const val M = Long.MAX_VALUE
fun f(a: Long): Int {
@@ -18,6 +17,14 @@ fun f(a: Long): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// JVM_TEMPLATES
// 1 LCMP
// 1 IFGE
// 1 IF
// 1 IF
// JVM_IR_TEMPLATES
// 2 LCMP
// 1 IFGT
// 1 IFLE
// 2 IF
@@ -1,24 +0,0 @@
// TARGET_BACKEND: JVM_IR
const val M = Long.MAX_VALUE
fun f(a: Long): Int {
var n = 0
for (i in a until M) {
n++
}
return n
}
// JVM non-IR uses while.
// JVM IR uses if + do-while.
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 2 LCMP
// 1 IFGT
// 1 IFLE
// 2 IF
@@ -1,4 +1,3 @@
// TARGET_BACKEND: JVM_IR
const val M = Long.MIN_VALUE
fun f(a: Long): Int {
@@ -18,5 +17,10 @@ fun f(a: Long): Int {
// 0 getFirst
// 0 getLast
// 0 getStep
// 0 IF
// 0 LINENUMBER 7
// 0 LINENUMBER 7
// JVM_TEMPLATES
// 1 IF
// JVM_IR_TEMPLATES
// 0 IF
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
fun f() {
for (i in 1..2) {
}
@@ -13,5 +12,10 @@ fun f() {
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF
// JVM_TEMPLATES
// 1 IF_ICMPGT
// 1 IF
// JVM_IR_TEMPLATES
// 1 IF_ICMPLE
@@ -1,17 +0,0 @@
// TARGET_BACKEND: JVM_IR
fun f() {
for (i in 1..2) {
}
}
// JVM non-IR uses while.
// JVM IR uses if + do-while. The surrounding "if" gets optimized in this test (constant condition).
// 0 iterator
// 0 getStart
// 0 getEnd
// 0 getFirst
// 0 getLast
// 0 getStep
// 1 IF_ICMPLE
// 1 IF