diff --git a/compiler/testData/codegen/box/volatile/intrinsics.kt b/compiler/testData/codegen/box/volatile/intrinsics.kt index dec3df6c6c6..f41abecb5c7 100644 --- a/compiler/testData/codegen/box/volatile/intrinsics.kt +++ b/compiler/testData/codegen/box/volatile/intrinsics.kt @@ -75,6 +75,13 @@ class ByteWrapper(@Volatile var x : Byte) : IncWrapper { override fun getAndAdd(delta: Byte) = this::x.getAndAddFieldLocal(delta) } +class BooleanWrapper(@Volatile var x : Boolean) : Wrapper { + override fun get(): Boolean = this::x.atomicGetField() + override fun set(new: Boolean) = this::x.atomicSetField(new) + override fun compareAndSwap(expected: Boolean, new: Boolean) = this::x.compareAndExchangeField(expected, new) + override fun compareAndSet(expected: Boolean, new: Boolean) = this::x.compareAndSetField(expected, new) + override fun getAndSet(new: Boolean) = this::x.getAndSetField(new) +} class StringWrapper(@Volatile var x : String) : RefWrapper { override fun get(): String = this::x.atomicGetField() @@ -137,6 +144,7 @@ fun box() : String { test(1, 2, 3, ::LongWrapper)?.let { return "Long: $it" } test(1, 2, 3, ::ShortWrapper)?.let { return "Short: $it" } test(1, 2, 3, ::ByteWrapper)?.let { return "Byte: $it" } + test(true, false, true, ::BooleanWrapper)?.let { return "Boolean: $it" } test("1", "2", "3", ::StringWrapper)?.let { return "String: $it" } test("1", "2", "3", { GenericWrapper(it) })?.let { return "Generic: $it" } test(1, 2, 3, { GenericWrapper(it) })?.let { return "Generic: $it" } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VolatileFieldsLowering.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VolatileFieldsLowering.kt index 304301139d0..e8186c00679 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VolatileFieldsLowering.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/VolatileFieldsLowering.kt @@ -246,6 +246,9 @@ internal class VolatileFieldsLowering(val context: Context) : FileLoweringPass { putValueArgument(index, expression.getValueArgument(index)) } }.let { + if (intrinsicType == IntrinsicType.ATOMIC_GET_FIELD || intrinsicType == IntrinsicType.ATOMIC_SET_FIELD) { + return it + } if (backingField.requiresBooleanConversion()) { for (arg in 0 until it.valueArgumentsCount) { it.putValueArgument(arg, builder.irBoolToByte(it.getValueArgument(arg)!!))