[K/N] Added FileCheck tests on bound check elimination

This commit is contained in:
Elena Lepilkina
2021-10-27 09:24:05 +03:00
committed by Space
parent 2620647b03
commit 453e4b1830
2 changed files with 228 additions and 0 deletions
@@ -5866,6 +5866,10 @@ fileCheckTest("filecheck_escape_analysis_disabled") {
checkPrefix = "CHECK-DEBUG"
}
fileCheckTest("filecheck_bce") {
annotatedSource = project.file('filecheck/bce.kt')
}
dependencies {
nopPluginApi project(kotlinCompilerModule)
nopPluginApi project(":native:kotlin-native-utils")
@@ -0,0 +1,224 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
// CHECK-LABEL: define void @"kfun:#forEachIndicies(){}"()
fun forEachIndicies() {
val array = Array(10) { 0 }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in array.indices) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[i] = 6
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forUntilSize(){}"()
fun forUntilSize() {
val array = Array(10) { 0L }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in 0 until array.size) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[i] = 6
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forDownToSize(){}"()
fun forDownToSize() {
val array = Array(10) { 0L }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in array.size - 1 downTo 0) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[i] = 6
}
// CHECK: {{^}}do_while_loop{{.*}}:
for (j in array.size - 3 downTo 0) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[j] = 6
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forRangeToSize(){}"()
fun forRangeToSize() {
val array = Array(10) { 0L }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in 0..array.size - 1) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[i] = 6
}
val length = array.size - 1
// CHECK: {{^}}do_while_loop{{.*}}:
for (j in 0..length) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[j] = 6
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forRangeToWithStep(){}"()
fun forRangeToWithStep() {
val array = Array(10) { 0L }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in 0..array.size - 1 step 2) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[i] = 6
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forUntilWithStep(){}"()
fun forUntilWithStep() {
val array = CharArray(10) { '0' }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in 0 until array.size step 2) {
// CHECK: invoke void @Kotlin_CharArray_set_without_BoundCheck
array[i] = '6'
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forDownToWithStep(){}"()
fun forDownToWithStep() {
val array = UIntArray(10) { 0U }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in array.size - 1 downTo 0 step 2) {
// CHECK: invoke void @Kotlin_IntArray_set_without_BoundCheck
array[i] = 6U
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forIndiciesWithStep(){}"()
fun forIndiciesWithStep() {
val array = Array(10) { 0L }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in array.indices step 2) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[i] = 6
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forWithIndex(){}"()
fun forWithIndex() {
val array = Array(10) { 100 }
// CHECK: {{^}}while_loop{{.*}}:
for ((index, value) in array.withIndex()) {
// CHECK: invoke %struct.ObjHeader* @Kotlin_Array_get_without_BoundCheck
array[index] = 6
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forReversed(){}"()
fun forReversed() {
val array = Array(10) { 100 }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in (0..array.size-1).reversed()) {
// CHECK: invoke void @Kotlin_Array_set_without_BoundCheck
array[i] = 6
}
}
// CHECK-LABEL: {{^}}epilogue:
fun foo(a: Int, b : Int): Int = a + b * 2
// CHECK-LABEL: define void @"kfun:#forEachCall(){}"()
fun forEachCall() {
val array = Array(10) { 100 }
var sum = 0
// CHECK: {{^}}while_loop{{.*}}:
array.forEach {
// CHECK: invoke %struct.ObjHeader* @Kotlin_Array_get_without_BoundCheck
sum += it
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#forLoop(){}"()
fun forLoop() {
val array = Array(10) { 100 }
var sum = 0
// CHECK: {{^}}while_loop{{.*}}:
for (it in array) {
// CHECK: invoke %struct.ObjHeader* @Kotlin_Array_get_without_BoundCheck
sum += it
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#innerLoop(){}"()
fun innerLoop() {
val array = Array(10) { 100 }
val array1 = Array(3) { 0 }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in 0 until array.size) {
// CHECK-DAG: invoke %struct.ObjHeader* @Kotlin_Array_get_without_BoundCheck
array[i] = 7
// CHECK-DAG: invoke void @Kotlin_Array_set_without_BoundCheck
// CHECK-DAG: invoke void @Kotlin_Array_set_without_BoundCheck
for (j in 0 until array1.size) {
array1[j] = array[i]
}
}
}
// CHECK-LABEL: {{^}}epilogue:
// CHECK-LABEL: define void @"kfun:#argsInFunctionCall(){}"()
fun argsInFunctionCall() {
val array = Array(10) { 100 }
val size = array.size - 1
val size1 = size
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in 0..size1) {
// CHECK: invoke %struct.ObjHeader* @Kotlin_Array_get_without_BoundCheck
// CHECK: invoke %struct.ObjHeader* @Kotlin_Array_get_without_BoundCheck
// CHECK: invoke i32 @"kfun:#foo(kotlin.Int;kotlin.Int){}kotlin.Int"
foo(array[i], array[i])
}
}
// CHECK-LABEL: {{^}}epilogue:
// define void @"kfun:#smallLoop(){}"()
fun smallLoop() {
val array = Array(10) { 100 }
// CHECK: {{^}}do_while_loop{{.*}}:
for (i in 0..array.size - 2) {
// CHECK: invoke %struct.ObjHeader* @Kotlin_Array_get_without_BoundCheck
array[i+1] = array[i]
}
}
// CHECK-LABEL: {{^}}epilogue:
fun main() {
forEachIndicies()
forUntilSize()
forDownToSize()
forRangeToSize()
forRangeToWithStep()
forUntilWithStep()
forDownToWithStep()
forIndiciesWithStep()
forWithIndex()
forReversed()
forEachCall()
forLoop()
innerLoop()
argsInFunctionCall()
smallLoop()
}