Files
swift-mirror/test/SILOptimizer/simplify_tuple_pack_element_addr.sil
Erik Eckstein 3243f87204 tests: remove the lit feature swift_in_compiler
Tests require the compiler built with SwiftCompilerSources since a long time.
So this lit feature was redundant anyway. We can remove it.
2026-06-30 14:47:56 +02:00

73 lines
3.3 KiB
Plaintext

// RUN: %target-sil-opt -enable-sil-verify-all %s -simplification -simplify-instruction=tuple_pack_element_addr | %FileCheck %s
import Swift
import Builtin
struct A {}
struct B {}
sil @use : $@convention(thin) <T> (@in_guaranteed T) -> ()
// CHECK-LABEL: sil @simplify_scalar_index_zero
// CHECK-NOT: tuple_pack_element_addr
// CHECK: [[ADDR:%[^,]+]] = tuple_element_addr %0, 0
// CHECK: apply {{.*}}<A>([[ADDR]])
// CHECK: } // end sil function 'simplify_scalar_index_zero'
sil @simplify_scalar_index_zero : $@convention(thin) (@inout (A, B)) -> () {
bb0(%tuple : $*(A, B)):
%idx = scalar_pack_index 0 of $Pack{A, B}
%addr = tuple_pack_element_addr %idx of %tuple : $*(A, B) as $*A
%use = function_ref @use : $@convention(thin) <T> (@in_guaranteed T) -> ()
apply %use<A>(%addr) : $@convention(thin) <T> (@in_guaranteed T) -> ()
%ret = tuple ()
return %ret : $()
}
// CHECK-LABEL: sil @simplify_scalar_index_one
// CHECK-NOT: tuple_pack_element_addr
// CHECK: [[ADDR:%[^,]+]] = tuple_element_addr %0, 1
// CHECK: apply {{.*}}<B>([[ADDR]])
// CHECK: } // end sil function 'simplify_scalar_index_one'
sil @simplify_scalar_index_one : $@convention(thin) (@inout (A, B)) -> () {
bb0(%tuple : $*(A, B)):
%idx = scalar_pack_index 1 of $Pack{A, B}
%addr = tuple_pack_element_addr %idx of %tuple : $*(A, B) as $*B
%use = function_ref @use : $@convention(thin) <T> (@in_guaranteed T) -> ()
apply %use<B>(%addr) : $@convention(thin) <T> (@in_guaranteed T) -> ()
%ret = tuple ()
return %ret : $()
}
// A dynamic_pack_index does not get simplified, since the indexed
// component is not statically known.
// CHECK-LABEL: sil @dont_simplify_dynamic_pack_index
// CHECK: tuple_pack_element_addr
// CHECK: } // end sil function 'dont_simplify_dynamic_pack_index'
sil @dont_simplify_dynamic_pack_index : $@convention(thin) (@inout (A, B), Builtin.Word) -> () {
bb0(%tuple : $*(A, B), %i : $Builtin.Word):
%idx = dynamic_pack_index %i of $Pack{A, B}
%tok = open_pack_element %idx of <each Z> at <Pack{A, B}>, shape $Z, uuid "01234567-89AB-CDEF-0123-000000000000"
%addr = tuple_pack_element_addr %idx of %tuple : $*(A, B) as $*@pack_element("01234567-89AB-CDEF-0123-000000000000") Z
%use = function_ref @use : $@convention(thin) <T> (@in_guaranteed T) -> ()
apply %use<@pack_element("01234567-89AB-CDEF-0123-000000000000") Z>(%addr) : $@convention(thin) <T> (@in_guaranteed T) -> ()
%ret = tuple ()
return %ret : $()
}
// A scalar_pack_index over a tuple containing a pack expansion does not
// get simplified, since tuple_element_addr cannot index past the
// expansion at compile time.
// CHECK-LABEL: sil @dont_simplify_pack_expansion_tuple
// CHECK: tuple_pack_element_addr
// CHECK: } // end sil function 'dont_simplify_pack_expansion_tuple'
sil @dont_simplify_pack_expansion_tuple : $@convention(thin) <each T> (@inout (A, repeat each T, B)) -> () {
bb0(%tuple : $*(A, repeat each T, B)):
%idx = scalar_pack_index 0 of $Pack{A, repeat each T, B}
%addr = tuple_pack_element_addr %idx of %tuple : $*(A, repeat each T, B) as $*A
%use = function_ref @use : $@convention(thin) <T> (@in_guaranteed T) -> ()
apply %use<A>(%addr) : $@convention(thin) <T> (@in_guaranteed T) -> ()
%ret = tuple ()
return %ret : $()
}