// 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(_ value: T) {} // UnsafeBufferPointer // ========================== // 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) -> String { return String(decoding: ptr, as: Unicode.UTF8.self) } // UnsafeMutableBufferPointer // ================================= // 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) -> String { return String(decoding: ptr, as: Unicode.UTF8.self) } // Array // ============ // 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 // ========== // CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeUBPSliceAsUTF8{{.*}} // CHECK-NOT: _fromCodeUnits // CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}} // CHECK-NOT: _fromCodeUnits // CHECK-LAST: br public func decodeUBPSliceAsUTF8(_ ptr: Slice>) -> String { return String(decoding: ptr, as: Unicode.UTF8.self) } // Slice // =========== // CHECK-LABEL: define {{.*}}swiftcc {{.*}}decodeURBPSliceAsUTF8{{.*}} // CHECK-NOT: _fromCodeUnits // CHECK: {{.*}} = call swiftcc {{.*}} @"$sSS18_fromUTF8Repairing{{.*}} // CHECK-NOT: _fromCodeUnits // CHECK: ret public func decodeURBPSliceAsUTF8(_ ptr: Slice>) -> String { blackhole("foo") // otherwise it just jumps into the Slice version return String(decoding: ptr, as: Unicode.UTF8.self) }