Skip to content

Commit 62df055

Browse files
committed
[cxx-interop] pass -std=c++20 to configurations using std::span
When the benchmarks are built with SwiftPM, the `std=c++20` flag is passed if the `-cxx-interoperability-mode` is present. This patch switches from `-Xfrontend -enable-experimental-cxx-interop` to the required interoperability flag.
1 parent 4fc85d7 commit 62df055

File tree

5 files changed

+153
-4
lines changed

5 files changed

+153
-4
lines changed

benchmark/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ set(SWIFT_BENCH_MODULES
214214
cxx-source/CxxVectorSum
215215
# TODO: rdar://92120528
216216
# cxx-source/ReadAccessor
217+
cxx-source/CxxSpanTests
217218
)
218219

219220
set(SWIFT_MULTISOURCE_SWIFT_BENCHES

benchmark/Package.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,7 @@ targets.append(
127127
dependencies: swiftBenchDeps,
128128
path: "utils",
129129
sources: ["main.swift"],
130-
swiftSettings: [.unsafeFlags(["-Xfrontend",
131-
"-enable-experimental-cxx-interop",
130+
swiftSettings: [.unsafeFlags(["-cxx-interoperability-mode=default",
132131
"-I",
133132
"utils/CxxTests"])]))
134133

@@ -166,8 +165,7 @@ targets += cxxSingleSourceLibraries.map { name in
166165
dependencies: singleSourceDeps,
167166
path: "cxx-source",
168167
sources: ["\(name).swift"],
169-
swiftSettings: [.unsafeFlags(["-Xfrontend",
170-
"-enable-experimental-cxx-interop",
168+
swiftSettings: [.unsafeFlags(["-cxx-interoperability-mode=default",
171169
"-I",
172170
"utils/CxxTests",
173171
// FIXME: https://github.com/apple/swift/issues/61453
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
//===--- CxxSpanTests.swift ----------------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
import TestsUtils
14+
import CxxStdlibPerformance
15+
16+
let iterRepeatFactor = 7
17+
18+
// FIXME swift-ci linux tests do not support std::span
19+
#if os(Linux)
20+
public let benchmarks = [BenchmarkInfo]()
21+
#else
22+
23+
public let benchmarks = [
24+
BenchmarkInfo(
25+
name: "CxxSpanTests.raw.iterator",
26+
runFunction: run_CxxSpanOfU32_RawIterator,
27+
tags: [.validation, .bridging, .cxxInterop],
28+
setUpFunction: makeSpanOnce),
29+
BenchmarkInfo(
30+
name: "CxxSpanTests.index.subscript",
31+
runFunction: run_CxxSpanOfU32_IndexAndSubscript,
32+
tags: [.validation, .bridging, .cxxInterop],
33+
setUpFunction: makeSpanOnce),
34+
BenchmarkInfo(
35+
name: "CxxSpanTests.for.loop",
36+
runFunction: run_CxxSpanOfU32_ForInLoop,
37+
tags: [.validation, .bridging, .cxxInterop],
38+
setUpFunction: makeSpanOnce),
39+
BenchmarkInfo(
40+
name: "CxxSpanTests.map",
41+
runFunction: run_CxxSpanOfU32_MapSpan,
42+
tags: [.validation, .bridging, .cxxInterop],
43+
setUpFunction: makeSpanOnce),
44+
BenchmarkInfo(
45+
name: "CxxSpanTests.filter",
46+
runFunction: run_CxxSpanOfU32_FilterSpan,
47+
tags: [.validation, .bridging, .cxxInterop],
48+
setUpFunction: makeSpanOnce),
49+
BenchmarkInfo(
50+
name: "CxxSpanTests.reduce",
51+
runFunction: run_CxxSpanOfU32_ReduceSpan,
52+
tags: [.validation, .bridging, .cxxInterop],
53+
setUpFunction: makeSpanOnce),
54+
]
55+
56+
func makeSpanOnce() {
57+
initSpan()
58+
}
59+
60+
@inline(never)
61+
public func run_CxxSpanOfU32_RawIterator(_ n: Int) {
62+
var sum: UInt32 = 0
63+
for _ in 0..<(n * iterRepeatFactor * 2) {
64+
var b = span.__beginUnsafe()
65+
let e = span.__endUnsafe()
66+
while b != e {
67+
sum = sum &+ b.pointee
68+
b = b.successor()
69+
}
70+
}
71+
blackHole(sum)
72+
}
73+
74+
@inline(never)
75+
public func run_CxxSpanOfU32_IndexAndSubscript(_ n: Int) {
76+
var sum: UInt32 = 0
77+
for _ in 0..<(n * iterRepeatFactor * 2) {
78+
for i in 0..<span.size() {
79+
sum = sum &+ span[i]
80+
}
81+
}
82+
blackHole(sum)
83+
}
84+
85+
@inline(never)
86+
public func run_CxxSpanOfU32_ForInLoop(_ n: Int) {
87+
var sum: UInt32 = 0
88+
for _ in 0..<(n * iterRepeatFactor * 2) {
89+
for x in span {
90+
sum = sum &+ x
91+
}
92+
}
93+
blackHole(sum)
94+
}
95+
96+
@inline(never)
97+
public func run_CxxSpanOfU32_MapSpan(_ n: Int) {
98+
for _ in 0..<(n * iterRepeatFactor) {
99+
let result = span.map { $0 &+ 5 }
100+
blackHole(result)
101+
}
102+
}
103+
104+
@inline(never)
105+
public func run_CxxSpanOfU32_FilterSpan(_ n: Int) {
106+
for _ in 0..<(n * iterRepeatFactor) {
107+
let result = span.filter { $0 % 2 == 0 }
108+
blackHole(result)
109+
}
110+
}
111+
112+
@inline(never)
113+
public func run_CxxSpanOfU32_ReduceSpan(_ n: Int) {
114+
var sum: UInt32 = 0
115+
for _ in 0..<(n * iterRepeatFactor * 2) {
116+
sum = sum &+ span.reduce(sum, &+)
117+
}
118+
blackHole(sum)
119+
}
120+
121+
#endif

benchmark/utils/CxxTests/CxxStdlibPerformance.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,26 @@
44
#include <vector>
55
#include <set>
66

7+
// FIXME swift-ci linux tests do not support std::span
8+
#if __has_include(<span>)
9+
#include <span>
10+
#endif
11+
12+
static const size_t spanSize = 50000;
13+
14+
using ArrayOfU32 = uint32_t[spanSize];
715
using VectorOfU32 = std::vector<uint32_t>;
816
using SetOfU32 = std::set<uint32_t>;
17+
#if __has_include(<span>)
18+
using SpanOfU32 = std::span<uint32_t>;
19+
#endif
920

21+
static inline ArrayOfU32 array;
1022
static inline VectorOfU32 vec;
1123
static inline SetOfU32 set;
24+
#if __has_include(<span>)
25+
static inline SpanOfU32 span;
26+
#endif
1227

1328
inline void initVector(size_t size) {
1429
if (!vec.empty()) {
@@ -29,6 +44,18 @@ inline void initSet(size_t size) {
2944
}
3045
}
3146

47+
#if __has_include(<span>)
48+
inline void initSpan() {
49+
if (!span.empty()) {
50+
return;
51+
}
52+
for (size_t i = 0; i < spanSize; ++i) {
53+
array[i] = uint32_t(i);
54+
}
55+
span = SpanOfU32(array);
56+
}
57+
#endif
58+
3259
inline VectorOfU32 makeVector32(size_t size) {
3360
initVector(size);
3461
return vec;

benchmark/utils/main.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import CreateObjects
6060
import CxxStringConversion
6161
// rdar://128520766
6262
// import CxxVectorSum
63+
import CxxSpanTests
6364
import DataBenchmarks
6465
import DeadArray
6566
import DevirtualizeProtocolComposition
@@ -258,6 +259,7 @@ register(CreateObjects.benchmarks)
258259
register(CxxStringConversion.benchmarks)
259260
// rdar://128520766
260261
// register(CxxVectorSum.benchmarks)
262+
register(CxxSpanTests.benchmarks)
261263
register(DataBenchmarks.benchmarks)
262264
register(DeadArray.benchmarks)
263265
register(DevirtualizeProtocolComposition.benchmarks)

0 commit comments

Comments
 (0)