From f5bd7cee0509be078a9f940b66fa6ee3cc5967d2 Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Wed, 13 Sep 2023 17:46:22 +0000 Subject: [PATCH] [K/N] Adjust filecheck tests for atomic intrinsics to -opt mode ^KT-60514 Fixed Merge-request: KT-MR-12179 Merged-by: Vladimir Sukharev --- .../backend.native/tests/filecheck/atomics.kt | 83 +++++++++++++++---- 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/kotlin-native/backend.native/tests/filecheck/atomics.kt b/kotlin-native/backend.native/tests/filecheck/atomics.kt index 619ba23de12..4b37ef47673 100644 --- a/kotlin-native/backend.native/tests/filecheck/atomics.kt +++ b/kotlin-native/backend.native/tests/filecheck/atomics.kt @@ -36,6 +36,8 @@ import kotlin.concurrent.* @Volatile var booleanGlobal: Boolean = true // Byte +fun byteGlobal_getField() = byteGlobal +fun byteGlobal_setField() { byteGlobal = 0 } // CHECK-LABEL: define {{signext i8|i8}} @"kfun:#byteGlobal_getAndSetField(){}kotlin.Byte"() // CHECK: atomicrmw xchg i8* @"kvar:byteGlobal#internal", i8 0 seq_cst @@ -60,6 +62,8 @@ fun byteGlobal_compareAndSetField() = ::byteGlobal.compareAndSetField(0.toByte() fun byteGlobal_compareAndExchangeField() = ::byteGlobal.compareAndExchangeField(0.toByte(), 1.toByte()) // Short +fun shortGlobal_getField() = shortGlobal +fun shortGlobal_setField() { shortGlobal = 0 } // CHECK-LABEL: define {{signext i16|i16}} @"kfun:#shortGlobal_getAndSetField(){} // CHECK: atomicrmw xchg i16* @"kvar:shortGlobal#internal", i16 0 seq_cst @@ -84,6 +88,8 @@ fun shortGlobal_compareAndSetField() = ::shortGlobal.compareAndSetField(0.toShor fun shortGlobal_compareAndExchangeField() = ::shortGlobal.compareAndExchangeField(0.toShort(), 1.toShort()) // Int +fun intGlobal_getField() = intGlobal +fun intGlobal_setField() { intGlobal = 0 } // CHECK-LABEL: define i32 @"kfun:#intGlobal_getAndSetField(){} // CHECK: atomicrmw xchg i32* @"kvar:intGlobal#internal", i32 0 seq_cst @@ -108,6 +114,8 @@ fun intGlobal_compareAndSetField() = ::intGlobal.compareAndSetField(0, 1) fun intGlobal_compareAndExchangeField() = ::intGlobal.compareAndExchangeField(0, 1) // Long +fun longGlobal_getField() = longGlobal +fun longGlobal_setField() { longGlobal = 0 } // CHECK-LABEL: define i64 @"kfun:#longGlobal_getAndSetField(){} // CHECK: atomicrmw xchg i64* @"kvar:longGlobal#internal", i64 0 seq_cst @@ -132,6 +140,8 @@ fun longGlobal_compareAndSetField() = ::longGlobal.compareAndSetField(0L, 1L) fun longGlobal_compareAndExchangeField() = ::longGlobal.compareAndExchangeField(0L, 1L) // Boolean +fun booleanGlobal_getField() = booleanGlobal +fun booleanGlobal_setField() { booleanGlobal = false } // CHECK-LABEL: define {{zeroext i1|i1}} @"kfun:#booleanGlobal_getAndSetField(){}kotlin.Boolean" // CHECK: atomicrmw xchg i8* @"kvar:booleanGlobal#internal", i8 %{{[0-9]+}} seq_cst @@ -154,35 +164,30 @@ fun booleanGlobal_compareAndExchangeField() = ::booleanGlobal.compareAndExchange val intArr = IntArray(2) // CHECK-LABEL: define i32 @"kfun:#intArr_atomicGet(){}kotlin.Int"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.IntArray" // CHECK: call i32* @Kotlin_intArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: load atomic i32, i32* %{{[0-9]+}} seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun intArr_atomicGet() = intArr.atomicGet(0) // CHECK-LABEL: define void @"kfun:#intArr_atomicSet(){}"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.IntArray" // CHECK: call i32* @Kotlin_intArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: store atomic i32 1, i32* %{{[0-9]+}} seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun intArr_atomicSet() = intArr.atomicSet(0, 1) // CHECK-LABEL: define i32 @"kfun:#intArr_getAndSet(){}kotlin.Int"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.IntArray" // CHECK: call i32* @Kotlin_intArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: atomicrmw xchg i32* %{{[0-9]+}}, i32 1 seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun intArr_getAndSet() = intArr.getAndSet(0, 1) // CHECK-LABEL: define i32 @"kfun:#intArr_getAndAdd(){}kotlin.Int"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.IntArray" // CHECK: call i32* @Kotlin_intArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: atomicrmw add i32* %{{[0-9]+}}, i32 1 seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun intArr_getAndAdd() = intArr.getAndAdd(0, 1) // CHECK-LABEL: define i32 @"kfun:#intArr_compareAndExchange(){}kotlin.Int"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.IntArray" // CHECK: call i32* @Kotlin_intArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: cmpxchg i32* %{{[0-9]+}}, i32 1, i32 2 seq_cst seq_cst // CHECK: extractvalue { i32, i1 } %{{[0-9]+}}, 0 @@ -190,7 +195,6 @@ fun intArr_getAndAdd() = intArr.getAndAdd(0, 1) fun intArr_compareAndExchange() = intArr.compareAndExchange(0, 1, 2) // CHECK-LABEL: define {{zeroext i1|i1}} @"kfun:#intArr_compareAndSet(){}kotlin.Boolean"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.IntArray" // CHECK: call i32* @Kotlin_intArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: cmpxchg i32* %{{[0-9]+}}, i32 1, i32 2 seq_cst seq_cst // CHECK: extractvalue { i32, i1 } %{{[0-9]+}}, 1 @@ -201,35 +205,30 @@ fun intArr_compareAndSet() = intArr.compareAndSet(0, 1, 2) val longArr = LongArray(2) // CHECK-LABEL: define i64 @"kfun:#longArr_atomicGet(){}kotlin.Long"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.LongArray" // CHECK: call i64* @Kotlin_longArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: load atomic i64, i64* %{{[0-9]+}} seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun longArr_atomicGet() = longArr.atomicGet(0) // CHECK-LABEL: define void @"kfun:#longArr_atomicSet(){}"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.LongArray" // CHECK: call i64* @Kotlin_longArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: store atomic i64 1, i64* %{{[0-9]+}} seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun longArr_atomicSet() = longArr.atomicSet(0, 1L) // CHECK-LABEL: define i64 @"kfun:#longArr_getAndSet(){}kotlin.Long"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.LongArray" // CHECK: call i64* @Kotlin_longArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: atomicrmw xchg i64* %{{[0-9]+}}, i64 1 seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun longArr_getAndSet() = longArr.getAndSet(0, 1L) // CHECK-LABEL: define i64 @"kfun:#longArr_getAndAdd(){}kotlin.Long"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.LongArray" // CHECK: call i64* @Kotlin_longArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: atomicrmw add i64* %{{[0-9]+}}, i64 1 seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun longArr_getAndAdd() = longArr.getAndAdd(0, 1L) // CHECK-LABEL: define i64 @"kfun:#longArr_compareAndExchange(){}kotlin.Long"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.LongArray" // CHECK: call i64* @Kotlin_longArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: cmpxchg i64* %{{[0-9]+}}, i64 1, i64 2 seq_cst seq_cst // CHECK: extractvalue { i64, i1 } %{{[0-9]+}}, 0 @@ -237,7 +236,6 @@ fun longArr_getAndAdd() = longArr.getAndAdd(0, 1L) fun longArr_compareAndExchange() = longArr.compareAndExchange(0, 1L, 2L) // CHECK-LABEL: define {{zeroext i1|i1}} @"kfun:#longArr_compareAndSet(){}kotlin.Boolean"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.LongArray" // CHECK: call i64* @Kotlin_longArrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: cmpxchg i64* %{{[0-9]+}}, i64 1, i64 2 seq_cst seq_cst // CHECK: extractvalue { i64, i1 } %{{[0-9]+}}, 1 @@ -248,38 +246,87 @@ fun longArr_compareAndSet() = longArr.compareAndSet(0, 1L, 2L) val refArr = arrayOfNulls(2) // CHECK-LABEL: define %struct.ObjHeader* @"kfun:#refArr_atomicGet(){}kotlin.String?" -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.Array" // CHECK: call %struct.ObjHeader** @Kotlin_arrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: load atomic %struct.ObjHeader*, %struct.ObjHeader** %{{[0-9]+}} seq_cst @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun refArr_atomicGet() = refArr.atomicGet(0) // CHECK-LABEL: define void @"kfun:#refArr_atomicSet(){}"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.Array" // CHECK: call %struct.ObjHeader** @Kotlin_arrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: call void @UpdateVolatileHeapRef(%struct.ObjHeader** %{{[0-9]+}}, %struct.ObjHeader* null) @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun refArr_atomicSet() = refArr.atomicSet(0, null) // CHECK-LABEL: define %struct.ObjHeader* @"kfun:#refArr_getAndSet(){}kotlin.String?" -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.Array" // CHECK: call %struct.ObjHeader** @Kotlin_arrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: call %struct.ObjHeader* @GetAndSetVolatileHeapRef(%struct.ObjHeader** %{{[0-9]+}}, %struct.ObjHeader* null, %struct.ObjHeader** %{{[0-9]+}}) @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun refArr_getAndSet() = refArr.getAndSet(0, null) // CHECK-LABEL: define %struct.ObjHeader* @"kfun:#refArr_compareAndExchange(){}kotlin.String?" -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.Array" // CHECK: call %struct.ObjHeader** @Kotlin_arrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: call %struct.ObjHeader* @CompareAndSwapVolatileHeapRef(%struct.ObjHeader** %{{[0-9]+}}, %struct.ObjHeader* null, %struct.ObjHeader* null, %struct.ObjHeader** %{{[0-9]+}}) @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun refArr_compareAndExchange() = refArr.compareAndExchange(0, null, null) // CHECK-LABEL: define {{zeroext i1|i1}} @"kfun:#refArr_compareAndSet(){}kotlin.Boolean"() -// CHECK: call %struct.ObjHeader* @"kfun:#(){}kotlin.Array" // CHECK: call %struct.ObjHeader** @Kotlin_arrayGetElementAddress(%struct.ObjHeader* %{{[0-9]+}}, i32 0) // CHECK: call {{zeroext i1|i1}} @CompareAndSetVolatileHeapRef(%struct.ObjHeader** %{{[0-9]+}}, %struct.ObjHeader* null, %struct.ObjHeader* null) @Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") fun refArr_compareAndSet() = refArr.compareAndSet(0, null, null) -fun main() {} +fun main() { + byteGlobal_getField() + byteGlobal_setField() + byteGlobal_getAndSetField() + byteGlobal_getAndAddField() + byteGlobal_compareAndSetField() + byteGlobal_compareAndExchangeField() + + shortGlobal_getField() + shortGlobal_setField() + shortGlobal_getAndSetField() + shortGlobal_getAndAddField() + shortGlobal_compareAndSetField() + shortGlobal_compareAndExchangeField() + + intGlobal_getField() + intGlobal_setField() + intGlobal_getAndSetField() + intGlobal_getAndAddField() + intGlobal_compareAndSetField() + intGlobal_compareAndExchangeField() + + longGlobal_getField() + longGlobal_setField() + longGlobal_getAndSetField() + longGlobal_getAndAddField() + longGlobal_compareAndSetField() + longGlobal_compareAndExchangeField() + + booleanGlobal_getField() + booleanGlobal_setField() + booleanGlobal_getAndSetField() + booleanGlobal_compareAndSetField() + booleanGlobal_compareAndExchangeField() + + intArr_atomicGet() + intArr_atomicSet() + intArr_getAndSet() + intArr_getAndAdd() + intArr_compareAndSet() + intArr_compareAndExchange() + + longArr_atomicGet() + longArr_atomicSet() + longArr_getAndSet() + longArr_getAndAdd() + longArr_compareAndSet() + longArr_compareAndExchange() + + refArr_atomicGet() + refArr_atomicSet() + refArr_getAndSet() + refArr_compareAndSet() + refArr_compareAndExchange() +}