Skip to content

Commit 410b88e

Browse files
authored
Fix @effects of finalizeUninitializedArray when assertions are enabled (#34101)
When assertions are enabled _endCOWMutation writes to _native.isImmutable. But finalizeUninitializedArray is marked as @effects(readnone). This mismatch caused miscompile in the stdlib due to CodeSinking optimization which relies on SILInstruction::mayReadOrWriteMemory which looks at @effects.
1 parent da61c8d commit 410b88e

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

stdlib/public/core/ArrayShared.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ func _deallocateUninitializedArray<Element>(
6464
array._deallocateUninitialized()
6565
}
6666

67+
#if !INTERNAL_CHECKS_ENABLED
6768
@_alwaysEmitIntoClient
6869
@_semantics("array.finalize_intrinsic")
6970
@_effects(readnone)
@@ -75,6 +76,20 @@ func _finalizeUninitializedArray<Element>(
7576
mutableArray._endMutation()
7677
return mutableArray
7778
}
79+
#else
80+
// When asserts are enabled, _endCOWMutation writes to _native.isImmutable
81+
// So we cannot have @_effects(readnone)
82+
@_alwaysEmitIntoClient
83+
@_semantics("array.finalize_intrinsic")
84+
public // COMPILER_INTRINSIC
85+
func _finalizeUninitializedArray<Element>(
86+
_ array: __owned Array<Element>
87+
) -> Array<Element> {
88+
var mutableArray = array
89+
mutableArray._endMutation()
90+
return mutableArray
91+
}
92+
#endif
7893

7994
extension Collection {
8095
// Utility method for collections that wish to implement

test/SILOptimizer/opt-remark-generator-yaml.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// RUN: %empty-directory(%t)
44
// RUN: %target-swiftc_driver -wmo -O -Xllvm -sil-disable-pass=FunctionSignatureOpts -emit-sil -save-optimization-record=yaml -save-optimization-record-path %t/note.yaml %s -o /dev/null && %FileCheck --input-file=%t/note.yaml %s
55

6+
// REQUIRES: optimized_stdlib,swift_stdlib_no_asserts
7+
68
// This file is testing out the basic YAML functionality to make sure that it
79
// works without burdening opt-remark-generator-yaml.swift with having to update all
810
// of the yaml test cases everytime new code is added.

test/SILOptimizer/opt-remark-generator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// RUN: %target-swiftc_driver -O -Rpass-missed=sil-opt-remark-gen -Xllvm -sil-disable-pass=FunctionSignatureOpts -emit-sil %s -o /dev/null -Xfrontend -verify
2-
// REQUIRES: optimized_stdlib
2+
// REQUIRES: optimized_stdlib,swift_stdlib_no_asserts
33

44
// XFAIL: OS=linux-androideabi && CPU=armv7
55

0 commit comments

Comments
 (0)