Skip to content

Commit 9bb0d94

Browse files
authored
Fix an edge case in AccessUseDefChainCloner so that canCloneUseDefChain does not assert on seeing begin_access (#38792)
1 parent 64095a6 commit 9bb0d94

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

include/swift/SIL/MemAccessUtils.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,6 +1590,11 @@ class AccessUseDefChainCloner
15901590
return cloneProjection(cast, sourceOper);
15911591
}
15921592

1593+
SILValue visitNestedAccess(BeginAccessInst *access) {
1594+
// The cloner does not currently know how to handle begin_access
1595+
return SILValue();
1596+
}
1597+
15931598
SILValue visitAccessProjection(SingleValueInstruction *projectedAddr,
15941599
Operand *sourceOper) {
15951600
return cloneProjection(projectedAddr, sourceOper);

test/SILOptimizer/cse_ossa_nontrivial.sil

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,3 +830,32 @@ bb0(%0 : @guaranteed $Klass):
830830
return %6 : $()
831831
}
832832

833+
class TestKlass {
834+
var testStruct: NonTrivialStruct
835+
}
836+
837+
sil [ossa] @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
838+
839+
// Currently ownership rauw does not handle this case
840+
// CHECK-LABEL: sil [ossa] @cse_ossa_accesspathclonetest :
841+
// CHECK: struct_element_addr
842+
// CHECK: struct_element_addr
843+
// CHECK-LABEL: } // end sil function 'cse_ossa_accesspathclonetest'
844+
sil [ossa] @cse_ossa_accesspathclonetest : $@convention(thin) (@guaranteed TestKlass) -> () {
845+
bb0(%0 : @guaranteed $TestKlass):
846+
%1 = ref_element_addr %0 : $TestKlass, #TestKlass.testStruct
847+
%2 = begin_access [modify] [dynamic] %1 : $*NonTrivialStruct
848+
%3 = struct_element_addr %2 : $*NonTrivialStruct, #NonTrivialStruct.val
849+
%4 = load_borrow %3 : $*Klass
850+
%f = function_ref @use_klass : $@convention(thin) (@guaranteed Klass) -> ()
851+
%c = apply %f(%4) : $@convention(thin) (@guaranteed Klass) -> ()
852+
end_borrow %4 : $Klass
853+
%3a = struct_element_addr %2 : $*NonTrivialStruct, #NonTrivialStruct.val
854+
%4a = load_borrow %3a : $*Klass
855+
%ca = apply %f(%4a) : $@convention(thin) (@guaranteed Klass) -> ()
856+
end_borrow %4a : $Klass
857+
end_access %2 : $*NonTrivialStruct
858+
%139 = tuple ()
859+
return %139 : $()
860+
}
861+

0 commit comments

Comments
 (0)