Skip to content

Commit 3bb3243

Browse files
authored
Merge pull request #8058 from gottesmm/revert_9f1daaa0238cbc559ce2d3d468d4b52b0e707b89
Revert "[semantic-sil] Fix ownership forwarding in emitCastToReferenc…
2 parents 66131c0 + c3c9ba3 commit 3bb3243

File tree

2 files changed

+20
-31
lines changed

2 files changed

+20
-31
lines changed

lib/SILGen/SILGenBuiltin.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -340,21 +340,25 @@ static ManagedValue emitCastToReferenceType(SILGenFunction &gen,
340340
SILValue undef = SILUndef::get(objPointerType, gen.SGM.M);
341341
return ManagedValue::forUnmanaged(undef);
342342
}
343-
344-
// Grab the argument.
345-
ManagedValue arg = args[0];
343+
344+
// Save the cleanup on the argument so we can forward it onto the cast
345+
// result.
346+
auto cleanup = args[0].getCleanup();
347+
348+
SILValue arg = args[0].getValue();
346349

347350
// If the argument is existential, open it.
348351
if (substitutions[0].getReplacement()->isClassExistentialType()) {
349352
auto openedTy
350353
= ArchetypeType::getOpened(substitutions[0].getReplacement());
351354
SILType loweredOpenedTy = gen.getLoweredLoadableType(openedTy);
352355
arg = gen.B.createOpenExistentialRef(loc, arg, loweredOpenedTy);
353-
gen.setArchetypeOpeningSite(openedTy, arg.getValue());
356+
gen.setArchetypeOpeningSite(openedTy, arg);
354357
}
355358

356-
// Return the cast result.
357-
return gen.B.createUncheckedRefCast(loc, arg, objPointerType);
359+
SILValue result = gen.B.createUncheckedRefCast(loc, arg, objPointerType);
360+
// Return the cast result with the original cleanup.
361+
return ManagedValue(result, cleanup);
358362
}
359363

360364
/// Specialized emitter for Builtin.castToNativeObject.

test/SILGen/builtins.swift

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -197,28 +197,20 @@ class C {}
197197
class D {}
198198

199199
// CHECK-LABEL: sil hidden @_T08builtins22class_to_native_object{{[_0-9a-zA-Z]*}}F
200-
// CHECK: bb0([[ARG:%.*]] : $C):
201-
// CHECK-NEXT: debug_value
202-
// CHECK-NEXT: [[BORROWED_ARG:%.*]] = begin_borrow [[ARG]]
203-
// CHECK-NEXT: [[COPY_BORROWED_ARG:%.*]] = copy_value [[BORROWED_ARG]]
204-
// CHECK-NEXT: [[OBJ:%.*]] = unchecked_ref_cast [[COPY_BORROWED_ARG:%.*]] to $Builtin.NativeObject
205-
// CHECK-NEXT: end_borrow [[BORROWED_ARG]] from [[ARG]]
206-
// CHECK-NEXT: destroy_value [[ARG]]
207-
// CHECK-NEXT: return [[OBJ]]
208200
func class_to_native_object(_ c:C) -> Builtin.NativeObject {
201+
// CHECK: [[OBJ:%.*]] = unchecked_ref_cast [[C:%.*]] to $Builtin.NativeObject
202+
// CHECK-NOT: destroy_value [[C]]
203+
// CHECK-NOT: destroy_value [[OBJ]]
204+
// CHECK: return [[OBJ]]
209205
return Builtin.castToNativeObject(c)
210206
}
211207

212208
// CHECK-LABEL: sil hidden @_T08builtins23class_to_unknown_object{{[_0-9a-zA-Z]*}}F
213-
// CHECK: bb0([[ARG:%.*]] : $C):
214-
// CHECK-NEXT: debug_value
215-
// CHECK-NEXT: [[BORROWED_ARG:%.*]] = begin_borrow [[ARG]]
216-
// CHECK-NEXT: [[COPY_BORROWED_ARG:%.*]] = copy_value [[BORROWED_ARG]]
217-
// CHECK-NEXT: [[OBJ:%.*]] = unchecked_ref_cast [[COPY_BORROWED_ARG:%.*]] to $Builtin.UnknownObject
218-
// CHECK-NEXT: end_borrow [[BORROWED_ARG]] from [[ARG]]
219-
// CHECK-NEXT: destroy_value [[ARG]]
220-
// CHECK-NEXT: return [[OBJ]]
221209
func class_to_unknown_object(_ c:C) -> Builtin.UnknownObject {
210+
// CHECK: [[OBJ:%.*]] = unchecked_ref_cast [[C:%.*]] to $Builtin.UnknownObject
211+
// CHECK-NOT: destroy_value [[C]]
212+
// CHECK-NOT: destroy_value [[OBJ]]
213+
// CHECK: return [[OBJ]]
222214
return Builtin.castToUnknownObject(c)
223215
}
224216

@@ -241,16 +233,9 @@ func class_archetype_to_unknown_object<T : C>(_ t: T) -> Builtin.UnknownObject {
241233
}
242234

243235
// CHECK-LABEL: sil hidden @_T08builtins34class_existential_to_native_object{{[_0-9a-zA-Z]*}}F
244-
// CHECK: bb0([[ARG:%.*]] : $ClassProto):
245-
// CHECK-NEXT: debug_value
246-
// CHECK-NEXT: [[BORROWED_ARG:%.*]] = begin_borrow [[ARG]]
247-
// CHECK-NEXT: [[COPY_BORROWED_ARG:%.*]] = copy_value [[BORROWED_ARG]]
248-
// CHECK-NEXT: [[REF:%[0-9]+]] = open_existential_ref [[COPY_BORROWED_ARG]] : $ClassProto
249-
// CHECK-NEXT: [[PTR:%[0-9]+]] = unchecked_ref_cast [[REF]] : $@opened({{.*}}) ClassProto to $Builtin.NativeObject
250-
// CHECK-NEXT: end_borrow [[BORROWED_ARG]] from [[ARG]]
251-
// CHECK-NEXT: destroy_value [[ARG]]
252-
// CHECK-NEXT: return [[PTR]]
253236
func class_existential_to_native_object(_ t:ClassProto) -> Builtin.NativeObject {
237+
// CHECK: [[REF:%[0-9]+]] = open_existential_ref [[T:%[0-9]+]] : $ClassProto
238+
// CHECK: [[PTR:%[0-9]+]] = unchecked_ref_cast [[REF]] : $@opened({{.*}}) ClassProto to $Builtin.NativeObject
254239
return Builtin.castToNativeObject(t)
255240
}
256241

0 commit comments

Comments
 (0)