Files
swift-mirror/test/SILOptimizer/simplify_tuple_pack_element_addr.sil

73 lines
3.1 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, id 1
%addr = tuple_pack_element_addr %idx of %tuple : $*(A, B) as $*@pack_element(1) Z
%use = function_ref @use : $@convention(thin) <T> (@in_guaranteed T) -> ()
apply %use<@pack_element(1) 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 : $()
}