[K/N][Tests] Move filecheck and cinterop tests to /native/

^KT-61259
This commit is contained in:
Vladimir Sukharev
2024-02-14 13:07:40 +01:00
committed by Space Team
parent 05cbe66ee0
commit bf0150108d
144 changed files with 1683 additions and 5542 deletions
@@ -0,0 +1,73 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
import kotlin.native.concurrent.*
import kotlinx.cinterop.*
val arr: Array<String> = arrayOf("1")
// CHECK-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
@kotlinx.cinterop.ExperimentalForeignApi
fun box(): String {
println(arr.size.toByte() == arr[0].toByte())
println(arr.size.toUByte() == arr[0].toUByte())
println(arr.size.toShort() == arr[0].toShort())
println(arr.size.toUShort() == arr[0].toUShort())
println(arr.size.toInt() == arr[0].toInt())
println(arr.size.toUInt() == arr[0].toUInt())
println(arr.size.toLong() == arr[0].toLong())
println(arr.size.toULong() == arr[0].toULong())
println(arr.size.toFloat() == arr[0].toFloat())
println(arr.size.toDouble() == arr[0].toDouble())
println(Char(arr.size) == arr[0][0])
println((arr.size == 1) == (arr[0] == "1")) // Boolean
memScoped {
val var1: IntVar = alloc()
val var2: IntVar = alloc()
println(var1.ptr.rawValue == var2.ptr.rawValue)
}
println(Result.success(arr.size) == Result.success(arr[0].toInt()))
println(vectorOf(arr.size, arr.size, arr.size, arr.size) == vectorOf(arr[0].toInt(), arr[0].toInt(), arr[0].toInt(), arr[0].toInt()))
val w1 = Worker.start()
val w2 = Worker.start()
println(w1 == w2)
val f1 = w1.requestTermination()
val f2 = w2.requestTermination()
println(f1 == f2)
f1.result
f2.result
return "OK"
}
// CHECK-OPT-NOT: {{call|invoke}} i64 @"kfun:kotlin#<Long-unbox>
// CHECK-OPT-NOT: {{call|invoke}} i64 @"kfun:kotlin#<ULong-unbox>
// CHECK-OPT-NOT: {{call|invoke}} i32 @"kfun:kotlin#<Int-unbox>
// CHECK-OPT-NOT: {{call|invoke}} i32 @"kfun:kotlin#<UInt-unbox>
// CHECK-OPT-NOT: {{call|invoke}} {{signext i16|i16}} @"kfun:kotlin#<Short-unbox>
// CHECK-OPT-NOT: {{call|invoke}} {{zeroext i16|i16}} @"kfun:kotlin#<UShort-unbox>
// CHECK-OPT-NOT: {{call|invoke}} {{signext i8|i8}} @"kfun:kotlin#<Byte-unbox>
// CHECK-OPT-NOT: {{call|invoke}} {{zeroext i8|i8}} @"kfun:kotlin#<UByte-unbox>
// CHECK-OPT-NOT: {{call|invoke}} {{zeroext i16|i16}} @"kfun:kotlin#<Char-unbox>
// CHECK-OPT-NOT: {{call|invoke}} {{zeroext i1|i1}} @"kfun:kotlin#<Boolean-unbox>
// CHECK-OPT-NOT: {{call|invoke}} double @"kfun:kotlin#<Double-unbox>
// CHECK-OPT-NOT: {{call|invoke}} float @"kfun:kotlin#<Float-unbox>
// CHECK-OPT-NOT: {{call|invoke}} i8* @"kfun:kotlin.native.internal#<NativePtr-unbox>
// CHECK-OPT-NOT: {{call|invoke}} i32 @"kfun:kotlin.native.concurrent#<Future-unbox>
// CHECK-OPT-NOT: {{call|invoke}} i32 @"kfun:kotlin.native.concurrent#<Worker-unbox>
// CHECK-OPT-NOT: {{call|invoke}} <4 x float> @"kfun:kotlin.native#<Vector128-unbox>
// CHECK-OPT-NOT: {{call|invoke}} %struct.ObjHeader* @"kfun:kotlin#<Result-unbox>
// CHECK-LABEL: epilogue:
// On APPLE targets, generated functions <T>ToNSNumber may contain non-converted invocations of unbox functions.
// CHECK-APPLE: {{IntToNSNumber|LongToNSNumber|ByteToNSNumber|ShortToNSNumber|FloatToNSNumber|DoubleToNSNumber}}
@@ -0,0 +1,20 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
import kotlinx.cinterop.*
// CHECK-AAPCS-OPT-LABEL: define i1 @"kfun:kotlinx.cinterop.CPointer#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-DEFAULTABI-OPT-LABEL: define zeroext i1 @"kfun:kotlinx.cinterop.CPointer#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-WINDOWSX64-OPT-LABEL: define zeroext i1 @"kfun:kotlinx.cinterop.CPointer#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-OPT: call i8* @"kfun:kotlinx.cinterop#<CPointer-unbox>(kotlin.Any?){}kotlinx.cinterop.CPointer<-1:0>?"
// This test is useless in debug mode.
// TODO(KT-59288): add ability to ignore tests in debug mode
// CHECK-DEBUG-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
@kotlinx.cinterop.ExperimentalForeignApi
fun box(): String = memScoped {
val var1: IntVar = alloc()
val var2: IntVar = alloc()
return if (var1.ptr == var2.ptr) "FAIL" else "OK"
}
@@ -0,0 +1,17 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
import kotlinx.cinterop.*
// CHECK-OPT-LABEL: define i8* @"kfun:kotlinx.cinterop#interpretOpaquePointed(kotlin.native.internal.NativePtr){}kotlinx.cinterop.NativePointed"(i8* %0)
// CHECK-OPT: call i8* @"kfun:kotlinx.cinterop#<NativePointed-unbox>(kotlin.Any?){}kotlinx.cinterop.NativePointed?"
// This test is useless in debug mode.
// TODO(KT-59288): add ability to ignore tests in debug mode
// CHECK-DEBUG-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
@kotlinx.cinterop.ExperimentalForeignApi
fun box(): String = memScoped {
val var1: NativePointed = alloc(4, 4)
return if (interpretOpaquePointed(var1.rawPtr) is NativePointed) "OK" else "FAIL"
}
@@ -0,0 +1,22 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
import kotlinx.cinterop.*
// CHECK-AAPCS-OPT-LABEL: define i1 @"kfun:kotlin.native.internal.NonNullNativePtr#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-DEFAULTABI-OPT-LABEL: define zeroext i1 @"kfun:kotlin.native.internal.NonNullNativePtr#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-WINDOWSX64-OPT-LABEL: define zeroext i1 @"kfun:kotlin.native.internal.NonNullNativePtr#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-OPT: call i8* @"kfun:kotlin.native.internal#<NonNullNativePtr-unbox>(kotlin.Any?){}kotlin.native.internal.NonNullNativePtr?"
// This test is useless in debug mode.
// TODO(KT-59288): add ability to ignore tests in debug mode
// CHECK-DEBUG-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
@kotlinx.cinterop.ExperimentalForeignApi
fun box(): String = memScoped {
val var1: IntVar = alloc()
val var2: IntVar = alloc()
// The first one is K1, the second one is K2.
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
return if (var1.ptr.value as Any == var2.ptr.value as Any) "FAIL" else "OK"
}
@@ -0,0 +1,26 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
import kotlinx.cinterop.*
// CHECK-AAPCS-OPT-LABEL: define i1 @"kfun:kotlinx.cinterop.StableRef#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-DEFAULTABI-OPT-LABEL: define zeroext i1 @"kfun:kotlinx.cinterop.StableRef#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-WINDOWSX64-OPT-LABEL: define zeroext i1 @"kfun:kotlinx.cinterop.StableRef#equals(kotlin.Any?){}kotlin.Boolean"(i8* %0, %struct.ObjHeader* %1)
// CHECK-OPT: call i8* @"kfun:kotlinx.cinterop#<StableRef-unbox>(kotlin.Any?){}kotlinx.cinterop.StableRef<-1:0>?"
// CHECK-OPT-LABEL: epilogue:
// This test is useless in debug mode.
// TODO(KT-59288): add ability to ignore tests in debug mode
// CHECK-DEBUG-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
@kotlinx.cinterop.ExperimentalForeignApi
fun box(): String {
val ref1 = StableRef.create(Any())
val ref2 = StableRef.create(Any())
val isEqual = ref1 == ref2
ref2.dispose()
ref1.dispose()
return if (!isEqual) "OK" else "FAIL"
}
@@ -0,0 +1,18 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
// CHECK-AAPCS-OPT-LABEL: define i1 @"kfun:kotlin.UByteArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-DEFAULTABI-OPT-LABEL: define zeroext i1 @"kfun:kotlin.UByteArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-WINDOWSX64-OPT-LABEL: define zeroext i1 @"kfun:kotlin.UByteArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
// CHECK-OPT: call %struct.ObjHeader* @"kfun:kotlin#<UByteArray-unbox>(kotlin.Any?){}kotlin.UByteArray?"
// CHECK-LABEL: epilogue:
fun box(): String {
val arr1 = UByteArray(10) { it.toUByte() }
val arr2 = UByteArray(10) { (it / 2).toUByte() }
return if (arr1 == arr2) "FAIL" else "OK"
}
@@ -0,0 +1,18 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
// CHECK-AAPCS-OPT-LABEL: define i1 @"kfun:kotlin.UIntArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-DEFAULTABI-OPT-LABEL: define zeroext i1 @"kfun:kotlin.UIntArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-WINDOWSX64-OPT-LABEL: define zeroext i1 @"kfun:kotlin.UIntArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
// CHECK-OPT: call %struct.ObjHeader* @"kfun:kotlin#<UIntArray-unbox>(kotlin.Any?){}kotlin.UIntArray?"
// CHECK-LABEL: epilogue:
fun box(): String {
val arr1 = UIntArray(10) { it.toUInt() }
val arr2 = UIntArray(10) { (it / 2).toUInt() }
return if (arr1 == arr2) "FAIL" else "OK"
}
@@ -0,0 +1,18 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
// CHECK-AAPCS-OPT-LABEL: define i1 @"kfun:kotlin.ULongArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-DEFAULTABI-OPT-LABEL: define zeroext i1 @"kfun:kotlin.ULongArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-WINDOWSX64-OPT-LABEL: define zeroext i1 @"kfun:kotlin.ULongArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
// CHECK-OPT: call %struct.ObjHeader* @"kfun:kotlin#<ULongArray-unbox>(kotlin.Any?){}kotlin.ULongArray?"
// CHECK-LABEL: epilogue:
fun box(): String {
val arr1 = ULongArray(10) { it.toULong() }
val arr2 = ULongArray(10) { (it / 2).toULong() }
return if (arr1 == arr2) "FAIL" else "OK"
}
@@ -0,0 +1,18 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
// CHECK-AAPCS-OPT-LABEL: define i1 @"kfun:kotlin.UShortArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-DEFAULTABI-OPT-LABEL: define zeroext i1 @"kfun:kotlin.UShortArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-WINDOWSX64-OPT-LABEL: define zeroext i1 @"kfun:kotlin.UShortArray#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-LABEL: define %struct.ObjHeader* @"kfun:#box(){}kotlin.String"
// CHECK-OPT: call %struct.ObjHeader* @"kfun:kotlin#<UShortArray-unbox>(kotlin.Any?){}kotlin.UShortArray?"
// CHECK-LABEL: epilogue:
fun box(): String {
val arr1 = UShortArray(10) { it.toUShort() }
val arr2 = UShortArray(10) { (it / 2).toUShort() }
return if (arr1 == arr2) "FAIL" else "OK"
}
@@ -0,0 +1,12 @@
// TARGET_BACKEND: NATIVE
// FILECHECK_STAGE: CStubs
// CHECK-AAPCS-LABEL: define i1 @"kfun:C#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-DEFAULTABI-LABEL: define zeroext i1 @"kfun:C#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK-WINDOWSX64-LABEL: define zeroext i1 @"kfun:C#equals(kotlin.Any?){}kotlin.Boolean"(%struct.ObjHeader* %0, %struct.ObjHeader* %1)
// CHECK: call %struct.ObjHeader* @"kfun:#<C-unbox>(kotlin.Any?){}C?"
value class C(val x: Any)
// Note: <C-unbox> is also called from bridges for equals, hashCode and toString.
fun box() =
if (C(42) == C(13)) "FAIL" else "OK"