1- // RUN: %target-swift-frontend -parse-stdlib -parse-stdlib -emit-ir -Onone %s | %FileCheck --check-prefix=IR-Onone %s
2-
3- // We check separately that:
1+ // RUN: %target-swift-frontend -parse-stdlib -emit-ir -Onone %s | %FileCheck --check-prefix=IR-Onone %s
42//
5- // 1. We properly emit our special functions as inline always.
6- // 2. end-to-end we inline the access markers.
3+ // Check that access markers in @_semantics("optimize.sil.preserve_exclusivity") functions generate runtime calls.
74
8- // RUN: %target-swift-frontend -parse-stdlib -Xllvm -sil-disable-pass=FunctionSignatureOpts -Xllvm -sil-disable-pass=GenericSpecializer -parse-stdlib -emit-ir -O -disable-llvm-optzns %s | %FileCheck --check-prefix=IR-Osil %s
9- // RUN: %target-swift-frontend -parse-stdlib -Xllvm -sil-disable-pass=FunctionSignatureOpts -Xllvm -sil-disable-pass=GenericSpecializer -parse-stdlib -emit-ir -O %s | %FileCheck --check-prefix=IR-Ollvm %s
5+ // RUN: %target-swift-frontend -parse-stdlib -Xllvm -sil-disable-pass=FunctionSignatureOpts -Xllvm -sil-disable-pass=GenericSpecializer -emit-ir -O %s | %FileCheck --check-prefix=IR-O %s
6+ //
7+ // Check that the -O pipeline preserves the runtime calls for @_semantics("optimize.sil.preserve_exclusivity") functions.
108
119@_silgen_name ( " marker1 " )
1210func marker1( ) -> ( )
@@ -20,83 +18,119 @@ func marker3() -> ()
2018@_silgen_name ( " marker4 " )
2119func marker4( ) -> ( )
2220
23- // IR-Onone: define swiftcc void @"$S20preserve_exclusivity10beginNoOptyyBp_BpxmtlF"(i8*, i8*, %swift.type*, %swift.type* %T1)
21+ @_silgen_name ( " marker5 " )
22+ func marker5( ) -> ( )
23+
24+ @_silgen_name ( " marker6 " )
25+ func marker6( ) -> ( )
26+
27+ // IR-Onone-LABEL: define {{.*}}swiftcc void @"$S20preserve_exclusivity10beginNoOptyyBp_BpxmtlF"(i8*, i8*, %swift.type*, %swift.type* %T1)
2428// IR-Onone: call void @swift_beginAccess
2529// IR-Onone-NEXT: ret void
2630
27- // IR-Osil : define swiftcc void @"$S20preserve_exclusivity10beginNoOptyyBp_BpxmtlF"(i8*, i8*, %swift.type*, %swift.type* %T1) [[ATTR:#[0-9][0-9]*]] {
28- // IR-Osil : call void @swift_beginAccess
29- // IR-Osil -NEXT: ret void
31+ // IR-O-LABEL : define {{.*}} swiftcc void @"$S20preserve_exclusivity10beginNoOptyyBp_BpxmtlF"(i8*, i8*, %swift.type*{{.*}} , %swift.type*{{.*}} %T1)
32+ // IR-O : call void @swift_beginAccess
33+ // IR-O -NEXT: ret void
3034
31- @inline ( never)
3235@_semantics ( " optimize.sil.preserve_exclusivity " )
3336public func beginNoOpt< T1 > ( _ address: Builtin . RawPointer , _ scratch: Builtin . RawPointer , _ ty1: T1 . Type ) {
3437 marker1 ( )
3538 Builtin . beginUnpairedModifyAccess ( address, scratch, ty1) ;
3639}
3740
38- // IR-Onone: define swiftcc void @"$S20preserve_exclusivity8endNoOptyyBpF"(i8*)
41+ // IR-Onone-LABEL : define {{.*}} swiftcc void @"$S20preserve_exclusivity8endNoOptyyBpF"(i8*)
3942// IR-Onone: call void @swift_endAccess
4043// IR-Onone-NEXT: ret void
4144
42- // IR-Osil: define swiftcc void @"$S20preserve_exclusivity8endNoOptyyBpF"(i8*) [[ATTR]]
43- // IR-Osil: call void @swift_endAccess
44- // IR-Osil-NEXT: ret void
45- @inline ( never)
45+ // IR-O-LABEL: define {{.*}}swiftcc void @"$S20preserve_exclusivity8endNoOptyyBpF"(i8*)
46+ // IR-O: call void @swift_endAccess
47+ // IR-O-NEXT: ret void
4648@_semantics ( " optimize.sil.preserve_exclusivity " )
4749public func endNoOpt( _ address: Builtin . RawPointer ) {
4850 marker2 ( )
4951 Builtin . endUnpairedAccess ( address)
5052}
5153
52- class Klass { }
54+ // IR-Onone-LABEL: define {{.*}}swiftcc void @"$S20preserve_exclusivity9readNoOptyyBp_xmtlF"(i8*, %swift.type*, %swift.type* %T1)
55+ // IR-Onone: call void @swift_beginAccess
56+ // IR-Onone: ret void
57+
58+ // IR-O-LABEL: define {{.*}}swiftcc void @"$S20preserve_exclusivity9readNoOptyyBp_xmtlF"(i8*, %swift.type*{{.*}}, %swift.type*{{.*}} %T1)
59+ // IR-O: call void @swift_beginAccess
60+ // IR-O: ret void
61+ @_semantics ( " optimize.sil.preserve_exclusivity " )
62+ public func readNoOpt< T1> ( _ address: Builtin . RawPointer , _ ty1: T1 . Type ) {
63+ marker3 ( )
64+ Builtin . performInstantaneousReadAccess ( address, ty1) ;
65+ }
5366
5467// Make sure testNoOpt properly inlines in our functions.
5568//
56- // IR-Ollvm: define swiftcc void @"$S20preserve_exclusivity9testNoOptyyBpF"(i8*)
57- // IR-Ollvm: call swiftcc void @marker1
58- // IR-Ollvm: call void @swift_beginAccess
59- // IR-Ollvm: call swiftcc void @marker2
60- // IR-Ollvm: call void @swift_endAccess
61- // IR-Ollvm-NEXT: ret void
69+ // IR-O-LABEL: define {{.*}}swiftcc void @"$S20preserve_exclusivity9testNoOptyyBpF"(i8*)
70+ // IR-O: call swiftcc void @marker1
71+ // IR-O: call void @swift_beginAccess
72+ // IR-O: call swiftcc void @marker2
73+ // IR-O: call void @swift_endAccess
74+ // IR-O: call swiftcc void @marker3
75+ // IR-O: call void @swift_beginAccess
76+ // IR-O: ret void
6277public func testNoOpt( _ k1: Builtin . RawPointer ) {
6378 beginNoOpt ( k1, k1, Builtin . RawPointer. self)
6479 endNoOpt ( k1)
80+ readNoOpt ( k1, Builtin . RawPointer. self)
6581}
6682
67- // IR-Onone: define swiftcc void @"$S20preserve_exclusivity8beginOptyyBp_BpxmtlF"(i8*, i8*, %swift.type*, %swift.type* %T1)
83+ // IR-Onone-LABEL : define {{.*}} swiftcc void @"$S20preserve_exclusivity8beginOptyyBp_BpxmtlF"(i8*, i8*, %swift.type*, %swift.type* %T1)
6884// IR-Onone: call void @swift_beginAccess
6985// IR-Onone-NEXT: ret void
7086
71- // IR-Osil : define swiftcc void @"$S20preserve_exclusivity8beginOptyyBp_BpxmtlF"(i8*, i8*, %swift.type*, %swift.type* %T1)
72- // IR-Osil -NEXT: entry
73- // IR-Osil -NEXT: call swiftcc void @marker3
74- // IR-Osil -NEXT: ret void
87+ // IR-O-LABEL : define {{.*}} swiftcc void @"$S20preserve_exclusivity8beginOptyyBp_BpxmtlF"(i8*{{.*}} , i8*{{.*}} , %swift.type*{{.*}} , %swift.type*{{.*}} %T1)
88+ // IR-O -NEXT: entry
89+ // IR-O -NEXT: call swiftcc void @marker4
90+ // IR-O -NEXT: ret void
7591
76- @inline ( never)
7792public func beginOpt< T1> ( _ address: Builtin . RawPointer , _ scratch: Builtin . RawPointer , _ ty1: T1 . Type ) {
78- marker3 ( )
93+ marker4 ( )
7994 Builtin . beginUnpairedModifyAccess ( address, scratch, ty1) ;
8095}
8196
82- // IR-Onone: define swiftcc void @"$S20preserve_exclusivity6endOptyyBpF"(i8*)
97+ // IR-Onone-LABEL : define {{.*}} swiftcc void @"$S20preserve_exclusivity6endOptyyBpF"(i8*)
8398// IR-Onone: call void @swift_endAccess
8499// IR-Onone-NEXT: ret void
85100
86- // IR-Osil : define swiftcc void @"$S20preserve_exclusivity6endOptyyBpF"(i8*)
87- // IR-Osil -NEXT: entry
88- // IR-Osil -NEXT: call swiftcc void @marker4
89- // IR-Osil -NEXT: ret void
101+ // IR-O-LABEL : define {{.*}} swiftcc void @"$S20preserve_exclusivity6endOptyyBpF"(i8*{{.*}} )
102+ // IR-O -NEXT: entry
103+ // IR-O -NEXT: call swiftcc void @marker5
104+ // IR-O -NEXT: ret void
90105
91- @inline ( never)
92106public func endOpt( _ address: Builtin . RawPointer ) {
93- marker4 ( )
107+ marker5 ( )
94108 Builtin . endUnpairedAccess ( address)
95109}
96110
111+ // IR-Onone-LABEL: define {{.*}}swiftcc void @"$S20preserve_exclusivity7readOptyyBp_xmtlF"(i8*, %swift.type*, %swift.type* %T1)
112+ // IR-Onone: call void @swift_beginAccess
113+ // IR-Onone: ret void
114+
115+ // IR-O-LABEL: define {{.*}}swiftcc void @"$S20preserve_exclusivity7readOptyyBp_xmtlF"(i8*{{.*}}, %swift.type*{{.*}}, %swift.type*{{.*}} %T1)
116+ // IR-O-NEXT: entry
117+ // IR-O-NEXT: call swiftcc void @marker6
118+ // IR-O-NEXT: ret void
119+
120+ public func readOpt< T1> ( _ address: Builtin . RawPointer , _ ty1: T1 . Type ) {
121+ marker6 ( )
122+ Builtin . performInstantaneousReadAccess ( address, ty1) ;
123+ }
124+
125+ // Make sure testOpt properly inlines in our functions.
126+ //
127+ // IR-O-LABEL: define {{.*}}swiftcc void @"$S20preserve_exclusivity7testOptyyBpF"(i8*{{.*}})
128+ // IR-O: call swiftcc void @marker4
129+ // IR-O: call swiftcc void @marker5
130+ // IR-O: call swiftcc void @marker6
131+ // IR-O: ret void
97132public func testOpt( _ k1: Builtin . RawPointer ) {
98133 beginOpt ( k1, k1, Builtin . RawPointer. self)
99134 endOpt ( k1)
135+ readOpt ( k1, Builtin . RawPointer. self)
100136}
101-
102- // IR-Osil: attributes [[ATTR]] = { alwaysinline
0 commit comments