Merge pull request #16828 from gottesmm/pr-84e7c044a8d49ddcb70f6fc1535e1309e96c6a27

[func-sig-opts] Add a regression benchmark that shows overhead from +…
diff --git a/benchmark/CMakeLists.txt b/benchmark/CMakeLists.txt
index 2a17ac2..90212e6 100644
--- a/benchmark/CMakeLists.txt
+++ b/benchmark/CMakeLists.txt
@@ -45,6 +45,7 @@
     single-source/BitCount
     single-source/ByteSwap
     single-source/COWTree
+    single-source/COWArrayGuaranteedParameterOverhead
     single-source/CString
     single-source/CSVParsing
     single-source/Calculator
diff --git a/benchmark/single-source/COWArrayGuaranteedParameterOverhead.swift b/benchmark/single-source/COWArrayGuaranteedParameterOverhead.swift
new file mode 100644
index 0000000..568c994
--- /dev/null
+++ b/benchmark/single-source/COWArrayGuaranteedParameterOverhead.swift
@@ -0,0 +1,42 @@
+//===--- COWArrayGuaranteedParameterOverhead.swift ------------------------===//
+//
+// This source file is part of the Swift.org open source project
+//
+// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
+// Licensed under Apache License v2.0 with Runtime Library Exception
+//
+// See https://swift.org/LICENSE.txt for license information
+// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+//
+//===----------------------------------------------------------------------===//
+
+import TestsUtils
+
+// This test makes sure that even though we have +0 arguments by default that we
+// can properly convert +0 -> +1 to avoid extra COW copies.
+
+public let COWArrayGuaranteedParameterOverhead = BenchmarkInfo(
+  name: "COWArrayGuaranteedParameterOverhead",
+  runFunction: run_COWArrayGuaranteedParameterOverhead,
+  tags: [.regression, .abstraction, .refcount])
+
+@inline(never)
+func caller() {
+  let x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
+  blackHole(callee(x))
+}
+
+@inline(never)
+func callee(_ x: [Int]) -> [Int] {
+  var y = x
+  // This should not copy.
+  y[2] = 27
+  return y
+}
+
+@inline(never)
+public func run_COWArrayGuaranteedParameterOverhead(_ N: Int) {
+  for _ in 0..<N*20000 {
+    caller()
+  }
+}
diff --git a/benchmark/utils/main.swift b/benchmark/utils/main.swift
index 6e875d0..bd37728 100644
--- a/benchmark/utils/main.swift
+++ b/benchmark/utils/main.swift
@@ -32,6 +32,7 @@
 import BitCount
 import ByteSwap
 import COWTree
+import COWArrayGuaranteedParameterOverhead
 import CString
 import CSVParsing
 import Calculator
@@ -184,6 +185,7 @@
 registerBenchmark(BitCount)
 registerBenchmark(ByteSwap)
 registerBenchmark(COWTree)
+registerBenchmark(COWArrayGuaranteedParameterOverhead)
 registerBenchmark(CString)
 registerBenchmark(CSVParsing)
 registerBenchmark(CSVParsingAlt)