Skip to content

Commit 415d4e3

Browse files
authored
Merge pull request #38757 from meg-gupta/accesspathfixpr
Fix an assert in collectUses when handling unknown index offsets.
2 parents 7a371e7 + c323c62 commit 415d4e3

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

lib/SIL/Utils/MemAccessUtils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1256,7 +1256,7 @@ int AccessPathDefUseTraversal::getPathOffset(const DFSEntry &dfs) const {
12561256
bool AccessPathDefUseTraversal::checkAndUpdateOffset(DFSEntry &dfs) {
12571257
int pathOffset = getPathOffset(dfs);
12581258
if (dfs.offset == AccessPath::UnknownOffset) {
1259-
if (pathOffset > 0) {
1259+
if (pathOffset != 0) {
12601260
// Pop the offset from the expected path; there should only be
12611261
// one. Continue matching subobject indices even after seeing an unknown
12621262
// offset. A subsequent mismatching subobject index is still considered

test/SILOptimizer/accesspath_uses_ossa.sil

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,3 +943,73 @@ bb0(%0 : @owned $AnyObject):
943943
dealloc_stack %1 : $*Optional<AnyObject>
944944
return %5 : $Optional<AnyObject>
945945
}
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

Comments
 (0)