mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
76 lines
3.8 KiB
Plaintext
76 lines
3.8 KiB
Plaintext
// RUN: %target-swift-frontend -emit-ir -primary-file %s | %IRGenFileCheck %s
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
struct Wrapper<Value> {
|
|
let value: Value
|
|
}
|
|
|
|
// This specifically needs to bypass outlining because it involves
|
|
// an opened element type.
|
|
//
|
|
// CHECK-LABEL: define{{.*}}void @test_outlining
|
|
// CHECK: [[PACK_ADDR_FOR_DEBUGINFO:%.*]] = ptrtoint ptr %"each T" to [[INT]]
|
|
// CHECK: [[PACK_ADDR:%.*]] = ptrtoint ptr %"each T" to [[INT]]
|
|
// CHECK-NEXT: [[PACK_ADDR2:%.*]] = and [[INT]] [[PACK_ADDR]], -2
|
|
// CHECK-NEXT: [[PACK:%.*]] = inttoptr [[INT]] [[PACK_ADDR2]] to ptr
|
|
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds ptr, ptr [[PACK]], [[INT]]
|
|
// CHECK-NEXT: [[ELT_TYPE:%.*]] = load ptr, ptr [[T0]], align
|
|
// CHECK: [[WRAPPER_RESPONSE:%.*]] = call swiftcc %swift.metadata_response @"$s26variadic_generic_outlining7WrapperVMa"
|
|
// CHECK-NEXT: [[WRAPPER_TYPE:%.*]] = extractvalue %swift.metadata_response [[WRAPPER_RESPONSE]]
|
|
// Test that we do the copy through the VWT for the element type.
|
|
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[WRAPPER_TYPE]], [[INT]] -1
|
|
sil hidden @test_outlining : $@convention(thin) <each T> (@pack_guaranteed Pack{repeat Wrapper<each T>}) -> @pack_out Pack{repeat Wrapper<each T>} {
|
|
bb0(%0 : $*Pack{repeat Wrapper<each T>}, %1 : $*Pack{repeat Wrapper<each T>}):
|
|
%zero = integer_literal $Builtin.Word, 0
|
|
%one = integer_literal $Builtin.Word, 1
|
|
%len = pack_length $Pack{repeat each T}
|
|
br bb1(%zero : $Builtin.Word)
|
|
|
|
bb1(%idx : $Builtin.Word):
|
|
%done = builtin "cmp_eq_Word"(%idx : $Builtin.Word, %len : $Builtin.Word) : $Builtin.Int1 // user: %10
|
|
cond_br %done, bb3, bb2
|
|
|
|
bb2:
|
|
%pi = dynamic_pack_index %idx of $Pack{repeat Wrapper<each T>}
|
|
%opening = open_pack_element %pi of <each T> at <Pack{repeat each T}>, shape $T, uuid "31FF306C-BF88-11ED-A03F-ACDE48001122"
|
|
%in = pack_element_get %pi of %0 : $*Pack{repeat Wrapper<each T>} as $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001122") T>
|
|
%out = pack_element_get %pi of %1 : $*Pack{repeat Wrapper<each T>} as $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001122") T>
|
|
copy_addr %in to [init] %out : $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001122") T>
|
|
%next = builtin "add_Word"(%idx : $Builtin.Word, %one : $Builtin.Word) : $Builtin.Word
|
|
br bb1(%next : $Builtin.Word)
|
|
|
|
bb3:
|
|
%ret = tuple ()
|
|
return %ret : $()
|
|
}
|
|
|
|
sil hidden @test_outlining_retain_release_addr : $@convention(thin) <each T> (@pack_guaranteed Pack{repeat Wrapper<each T>}) -> @pack_out Pack{repeat Wrapper<each T>} {
|
|
bb0(%0 : $*Pack{repeat Wrapper<each T>}, %1 : $*Pack{repeat Wrapper<each T>}):
|
|
%zero = integer_literal $Builtin.Word, 0
|
|
%one = integer_literal $Builtin.Word, 1
|
|
%len = pack_length $Pack{repeat each T}
|
|
br bb1(%zero : $Builtin.Word)
|
|
|
|
bb1(%idx : $Builtin.Word):
|
|
%done = builtin "cmp_eq_Word"(%idx : $Builtin.Word, %len : $Builtin.Word) : $Builtin.Int1 // user: %10
|
|
cond_br %done, bb3, bb2
|
|
|
|
bb2:
|
|
%pi = dynamic_pack_index %idx of $Pack{repeat Wrapper<each T>}
|
|
%opening = open_pack_element %pi of <each T> at <Pack{repeat each T}>, shape $T, uuid "31FF306C-BF88-11ED-A03F-ACDE48001123"
|
|
%in = pack_element_get %pi of %0 : $*Pack{repeat Wrapper<each T>} as $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001123") T>
|
|
%out = pack_element_get %pi of %1 : $*Pack{repeat Wrapper<each T>} as $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001123") T>
|
|
// Make sure that these don't crash.
|
|
retain_value_addr %in : $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001123") T>
|
|
release_value_addr %in : $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001123") T>
|
|
copy_addr %in to [init] %out : $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001123") T>
|
|
%next = builtin "add_Word"(%idx : $Builtin.Word, %one : $Builtin.Word) : $Builtin.Word
|
|
br bb1(%next : $Builtin.Word)
|
|
|
|
bb3:
|
|
%ret = tuple ()
|
|
return %ret : $()
|
|
}
|