Skip to content

Commit 7b129fa

Browse files
committed
Merge pull request #2171 from eeckstein/dead-obj-elim
Bug fixes in DeadObjectElimination
2 parents 001998c + b8feb27 commit 7b129fa

File tree

4 files changed

+80
-8
lines changed

4 files changed

+80
-8
lines changed

include/swift/SILOptimizer/Utils/Local.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,9 @@ class ValueLifetimeAnalysis {
270270
/// It is assumed that \p Inst is located after the value's definition.
271271
bool isWithinLifetime(SILInstruction *Inst);
272272

273+
/// For debug dumping.
274+
void dump() const;
275+
273276
private:
274277

275278
/// The value.

lib/SILOptimizer/Transforms/DeadObjectElimination.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -580,15 +580,12 @@ static bool removeAndReleaseArray(SILValue NewArrayValue, bool &CFGChanged) {
580580
auto *TupleElt = dyn_cast<TupleExtractInst>(Op->getUser());
581581
if (!TupleElt)
582582
return false;
583-
switch (TupleElt->getFieldNo()) {
584-
default:
585-
return false;
586-
case 0:
583+
if (TupleElt->getFieldNo() == 0 && !ArrayDef) {
587584
ArrayDef = TupleElt;
588-
break;
589-
case 1:
585+
} else if (TupleElt->getFieldNo() == 1 && !StorageAddress) {
590586
StorageAddress = TupleElt;
591-
break;
587+
} else {
588+
return false;
592589
}
593590
}
594591
if (!ArrayDef)
@@ -623,7 +620,7 @@ static bool removeAndReleaseArray(SILValue NewArrayValue, bool &CFGChanged) {
623620
return false;
624621

625622
// Find array object lifetime.
626-
ValueLifetimeAnalysis VLA(ArrayDef, DeadArray.getAllUsers());
623+
ValueLifetimeAnalysis VLA(NewArrayValue, DeadArray.getAllUsers());
627624

628625
// Check that all storage users are in the Array's live blocks.
629626
for (auto *User : DeadStorage.getAllUsers()) {

lib/SILOptimizer/Utils/Local.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,6 +1240,18 @@ bool ValueLifetimeAnalysis::isWithinLifetime(SILInstruction *Inst) {
12401240
llvm_unreachable("Expected to find use of value in block!");
12411241
}
12421242

1243+
void ValueLifetimeAnalysis::dump() const {
1244+
llvm::errs() << "lifetime of def: " << *DefValue;
1245+
for (SILInstruction *Use : UserSet) {
1246+
llvm::errs() << " use: " << *Use;
1247+
}
1248+
llvm::errs() << " live blocks:";
1249+
for (SILBasicBlock *BB : LiveBlocks) {
1250+
llvm::errs() << ' ' << BB->getDebugID();
1251+
}
1252+
llvm::errs() << '\n';
1253+
}
1254+
12431255
//===----------------------------------------------------------------------===//
12441256
// Casts Optimization and Simplification
12451257
//===----------------------------------------------------------------------===//

test/SILOptimizer/dead_array_elim.sil

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,66 @@ bb2:
115115
return %18 : $()
116116
}
117117

118+
// CHECK-LABEL: sil @tuple_extract_in_different_block
119+
// CHECK: bb0(%0 : $TrivialDestructor):
120+
// CHECK-NEXT: strong_retain %0
121+
// CHECK-NEXT: br bb1
122+
// CHECK: bb1:
123+
// CHECK-NEXT: strong_release %0
124+
// CHECK: return
125+
sil @tuple_extract_in_different_block : $@convention(thin) (@owned TrivialDestructor) -> () {
126+
bb0(%0 : $TrivialDestructor):
127+
%2 = integer_literal $Builtin.Word, 2
128+
// function_ref Swift._allocateUninitializedArray <A> (Builtin.Word) -> (Swift.Array<A>, Builtin.RawPointer)
129+
%3 = function_ref @allocArray : $@convention(thin) <τ_0_0> (Builtin.Word) -> @owned (Array<τ_0_0>, Builtin.RawPointer)
130+
%4 = apply %3<TrivialDestructor>(%2) : $@convention(thin) <τ_0_0> (Builtin.Word) -> @owned (Array<τ_0_0>, Builtin.RawPointer)
131+
%6 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 1
132+
%7 = pointer_to_address %6 : $Builtin.RawPointer to $*TrivialDestructor
133+
strong_retain %0 : $TrivialDestructor
134+
store %0 to %7 : $*TrivialDestructor
135+
br bb1
136+
137+
bb1:
138+
%5 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 0
139+
%13 = struct_extract %5 : $Array<TrivialDestructor>, #Array._buffer
140+
%14 = struct_extract %13 : $_ArrayBuffer<TrivialDestructor>, #_ArrayBuffer._storage
141+
%15 = struct_extract %14 : $_BridgeStorage<_ContiguousArrayStorageBase, _NSArrayCore>, #_BridgeStorage.rawValue
142+
strong_release %15 : $Builtin.BridgeObject
143+
%18 = tuple ()
144+
return %18 : $()
145+
}
146+
147+
148+
// CHECK-LABEL: sil @multiple_tuple_extracts
149+
// CHECK: apply
150+
// CHECK: store
151+
// CHECK: load
152+
// CHECK: strong_release
153+
// CHECK: return
154+
sil @multiple_tuple_extracts : $@convention(thin) (@owned TrivialDestructor) -> @owned TrivialDestructor {
155+
bb0(%0 : $TrivialDestructor):
156+
%2 = integer_literal $Builtin.Word, 2
157+
// function_ref Swift._allocateUninitializedArray <A> (Builtin.Word) -> (Swift.Array<A>, Builtin.RawPointer)
158+
%3 = function_ref @allocArray : $@convention(thin) <τ_0_0> (Builtin.Word) -> @owned (Array<τ_0_0>, Builtin.RawPointer)
159+
%4 = apply %3<TrivialDestructor>(%2) : $@convention(thin) <τ_0_0> (Builtin.Word) -> @owned (Array<τ_0_0>, Builtin.RawPointer)
160+
%10 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 1
161+
%11 = pointer_to_address %10 : $Builtin.RawPointer to $*TrivialDestructor
162+
strong_retain %0 : $TrivialDestructor
163+
store %0 to %11 : $*TrivialDestructor
164+
165+
%20 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 1
166+
%21 = pointer_to_address %20 : $Builtin.RawPointer to $*TrivialDestructor
167+
%22 = load %21 : $*TrivialDestructor
168+
169+
%12 = tuple_extract %4 : $(Array<TrivialDestructor>, Builtin.RawPointer), 0
170+
%13 = struct_extract %12 : $Array<TrivialDestructor>, #Array._buffer
171+
%14 = struct_extract %13 : $_ArrayBuffer<TrivialDestructor>, #_ArrayBuffer._storage
172+
%15 = struct_extract %14 : $_BridgeStorage<_ContiguousArrayStorageBase, _NSArrayCore>, #_BridgeStorage.rawValue
173+
strong_release %15 : $Builtin.BridgeObject
174+
175+
return %22 : $TrivialDestructor
176+
}
177+
118178
// CHECK-LABEL: sil @release_dead_array_on_two_branches
119179
// CHECK: bb0(%0 : $TrivialDestructor, %1 : $TrivialDestructor):
120180
// CHECK-NEXT: cond_br

0 commit comments

Comments
 (0)