// RUN: %target-swift-frontend -emit-ir -primary-file %s | %IRGenFileCheck %s import Builtin import Swift struct Wrapper { 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) (@pack_guaranteed Pack{repeat Wrapper}) -> @pack_out Pack{repeat Wrapper} { bb0(%0 : $*Pack{repeat Wrapper}, %1 : $*Pack{repeat Wrapper}): %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} %opening = open_pack_element %pi of at , shape $T, uuid "31FF306C-BF88-11ED-A03F-ACDE48001122" %in = pack_element_get %pi of %0 : $*Pack{repeat Wrapper} as $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001122") T> %out = pack_element_get %pi of %1 : $*Pack{repeat Wrapper} 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) (@pack_guaranteed Pack{repeat Wrapper}) -> @pack_out Pack{repeat Wrapper} { bb0(%0 : $*Pack{repeat Wrapper}, %1 : $*Pack{repeat Wrapper}): %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} %opening = open_pack_element %pi of at , shape $T, uuid "31FF306C-BF88-11ED-A03F-ACDE48001123" %in = pack_element_get %pi of %0 : $*Pack{repeat Wrapper} as $*Wrapper<@pack_element("31FF306C-BF88-11ED-A03F-ACDE48001123") T> %out = pack_element_get %pi of %1 : $*Pack{repeat Wrapper} 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 : $() }