@@ -943,3 +943,73 @@ bb0(%0 : @owned $AnyObject):
943
943
dealloc_stack %1 : $*Optional<AnyObject>
944
944
return %5 : $Optional<AnyObject>
945
945
}
946
+
947
+ class Klass {
948
+ }
949
+
950
+ struct NonTrivialStruct {
951
+ var klass: Klass
952
+ }
953
+
954
+ sil [ossa] @get_unsafe_struct : $@convention(thin) () -> UnsafeMutablePointer<NonTrivialStruct>
955
+
956
+ // TODO: Since builtin "truncOrBitCast_Int64_Word" is on a literal, we should be able to get an access path of (#0)
957
+ // CHECK-LABEL: @test_accesspath_offset1
958
+ // CHECK: ###For MemOp: %8 = load_borrow %7 : $*Klass
959
+ // CHECK: Unidentified %3 = struct_extract %2 : $UnsafeMutablePointer<NonTrivialStruct>, #UnsafeMutablePointer._rawValue
960
+ // CHECK: Base: %3 = struct_extract %2 : $UnsafeMutablePointer<NonTrivialStruct>, #UnsafeMutablePointer._rawValue
961
+ // CHECK: Storage: Unidentified %3 = struct_extract %2 : $UnsafeMutablePointer<NonTrivialStruct>, #UnsafeMutablePointer._rawValue
962
+ // CHECK: Path: (@Unknown,#0)
963
+ // CHECK: Exact Uses {
964
+ // CHECK: }
965
+ // CHECK: Inner Uses {
966
+ // CHECK: }
967
+ // CHECK: Overlapping Uses {
968
+ // CHECK: %8 = load_borrow %7 : $*Klass
969
+ // CHECK: Path: (@Unknown,#0)
970
+ // CHECK: }
971
+ sil [ossa] @test_accesspath_offset1 : $@convention(thin) () -> () {
972
+ bb0:
973
+ %0 = integer_literal $Builtin.Int64, 0
974
+ %1 = function_ref @get_unsafe_struct : $@convention(thin) () -> UnsafeMutablePointer<NonTrivialStruct>
975
+ %2 = apply %1() : $@convention(thin) () -> UnsafeMutablePointer<NonTrivialStruct>
976
+ %3 = struct_extract %2 : $UnsafeMutablePointer<NonTrivialStruct>, #UnsafeMutablePointer._rawValue
977
+ %4 = builtin "truncOrBitCast_Int64_Word"(%0 : $Builtin.Int64) : $Builtin.Word
978
+ %5 = pointer_to_address %3 : $Builtin.RawPointer to [strict] $*NonTrivialStruct
979
+ %6 = index_addr %5 : $*NonTrivialStruct, %4 : $Builtin.Word
980
+ %7 = struct_element_addr %6 : $*NonTrivialStruct, #NonTrivialStruct.klass
981
+ %8 = load_borrow %7 : $*Klass
982
+ end_borrow %8 : $Klass
983
+ %ret = tuple ()
984
+ return %ret : $()
985
+ }
986
+
987
+ // CHECK-LABEL: @test_accesspath_offset2
988
+ // CHECK: ###For MemOp: %8 = load_borrow %7 : $*Klass // user: %9
989
+ // CHECK: Unidentified %3 = struct_extract %2 : $UnsafeMutablePointer<NonTrivialStruct>, #UnsafeMutablePointer._rawValue // user: %5
990
+ // CHECK: Base: %3 = struct_extract %2 : $UnsafeMutablePointer<NonTrivialStruct>, #UnsafeMutablePointer._rawValue // user: %5
991
+ // CHECK: Storage: Unidentified %3 = struct_extract %2 : $UnsafeMutablePointer<NonTrivialStruct>, #UnsafeMutablePointer._rawValue // user: %5
992
+ // CHECK: Path: (@Unknown,#0)
993
+ // CHECK: Exact Uses {
994
+ // CHECK: }
995
+ // CHECK: Inner Uses {
996
+ // CHECK: }
997
+ // CHECK: Overlapping Uses {
998
+ // CHECK: %8 = load_borrow %7 : $*Klass // user: %9
999
+ // CHECK: Path: (@Unknown,#0)
1000
+ // CHECK: }
1001
+ sil [ossa] @test_accesspath_offset2 : $@convention(thin) (Builtin.Int64) -> () {
1002
+ bb0(%0 : $Builtin.Int64):
1003
+ %1 = function_ref @get_unsafe_struct : $@convention(thin) () -> UnsafeMutablePointer<NonTrivialStruct>
1004
+ %2 = apply %1() : $@convention(thin) () -> UnsafeMutablePointer<NonTrivialStruct>
1005
+ %3 = struct_extract %2 : $UnsafeMutablePointer<NonTrivialStruct>, #UnsafeMutablePointer._rawValue
1006
+ %4 = builtin "truncOrBitCast_Int64_Word"(%0 : $Builtin.Int64) : $Builtin.Word
1007
+ %5 = pointer_to_address %3 : $Builtin.RawPointer to [strict] $*NonTrivialStruct
1008
+ %6 = index_addr %5 : $*NonTrivialStruct, %4 : $Builtin.Word
1009
+ %7 = struct_element_addr %6 : $*NonTrivialStruct, #NonTrivialStruct.klass
1010
+ %8 = load_borrow %7 : $*Klass
1011
+ end_borrow %8 : $Klass
1012
+ %ret = tuple ()
1013
+ return %ret : $()
1014
+ }
1015
+
0 commit comments