blob: b76bd2bc0212d633547e722f1d1ad6ace608d3a6 [file] [log] [blame]
// RUN: %target-swift-frontend -Xllvm -swiftmergefunc-threshold=0 -parse-as-library -O -target-cpu core2 -emit-ir %s | %FileCheck %s
// REQUIRES: optimized_stdlib,CPU=x86_64
// This is an end-to-end test to ensure that the optimizer generates
// good code for various ways to create a String from a Sequence of UTF-8
// bytes for which a fast path exists.
// Please note: this test targets "core2" to ensure consistent output
// on all x86 host processors.
@inline(never)
func blackhole<T>(_ value: T) {}
// UnsafeBufferPointer<UInt8>
// ==========================
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}s22utf8_decoding_fastpath15decodeUBPAsUTF8ySSSRys5UInt8VGF{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK-LAST: ret
public func decodeUBPAsUTF8(_ ptr: UnsafeBufferPointer<UInt8>) -> String {
return String(decoding: ptr, as: Unicode.UTF8.self)
}
// UnsafeMutableBufferPointer<UInt8>
// =================================
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}s22utf8_decoding_fastpath16decodeUMBPAsUTF8ySSSrys5UInt8VGF{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK-LAST: ret
public func decodeUMBPAsUTF8(_ ptr: UnsafeMutableBufferPointer<UInt8>) -> String {
return String(decoding: ptr, as: Unicode.UTF8.self)
}
// Array<UInt8>
// ============
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeArrayAsUTF8{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK-LAST: ret
public func decodeArrayAsUTF8(_ ptr: [UInt8]) -> String {
return String(decoding: ptr, as: Unicode.UTF8.self)
}
// UnsafeRawBufferPointer
// ======================
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeURBPAsUTF8{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK-LAST: ret
public func decodeURBPAsUTF8(_ ptr: UnsafeRawBufferPointer) -> String {
return String(decoding: ptr, as: Unicode.UTF8.self)
}
// UnsafeMutableRawBufferPointer
// =============================
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeUMRBPAsUTF8{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK-LAST: ret
public func decodeUMRBPAsUTF8(_ ptr: UnsafeMutableRawBufferPointer) -> String {
return String(decoding: ptr, as: Unicode.UTF8.self)
}
// String.UTF8View
// ===============
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeStringUTF8ViewAs{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK-LAST: br
public func decodeStringUTF8ViewAsUTF8(_ ptr: String.UTF8View) -> String {
return String(decoding: ptr, as: Unicode.UTF8.self)
}
// Substring.UTF8View
// ==================
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeSubstringUTF8ViewAs{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK-LAST: br
public func decodeSubstringUTF8ViewAsUTF8(_ ptr: Substring.UTF8View) -> String {
return String(decoding: ptr, as: Unicode.UTF8.self)
}
// Slice<UBP>
// ==========
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeUBPSliceAsUTF8{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK-LAST: br
public func decodeUBPSliceAsUTF8(_ ptr: Slice<UnsafeBufferPointer<UInt8>>) -> String {
return String(decoding: ptr, as: Unicode.UTF8.self)
}
// Slice<URBP>
// ===========
// CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeURBPSliceAsUTF8{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}}
// CHECK-NOT: _fromCodeUnits
// CHECK: ret
public func decodeURBPSliceAsUTF8(_ ptr: Slice<UnsafeBufferPointer<UInt8>>) -> String {
blackhole("foo") // otherwise it just jumps into the Slice<UBP> version
return String(decoding: ptr, as: Unicode.UTF8.self)
}