Skip to content

Commit a70eb28

Browse files
committed
[ownership] Accept unconditional_checked_cast_addr, treating it like a write.
Just missed this on my first pass through. rdar://62609950
1 parent 8b52da8 commit a70eb28

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

lib/SIL/Verifier/LoadBorrowInvalidationChecker.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,12 @@ constructValuesForKey(SILValue initialValue,
264264
continue;
265265
}
266266

267+
// unconditional_checked_cast_addr does a take on its input memory.
268+
if (isa<UnconditionalCheckedCastAddrInst>(user)) {
269+
wellBehavedWriteAccumulator.push_back(op);
270+
continue;
271+
}
272+
267273
if (auto *ccabi = dyn_cast<CheckedCastAddrBranchInst>(user)) {
268274
if (ccabi->getConsumptionKind() != CastConsumptionKind::CopyOnSuccess) {
269275
wellBehavedWriteAccumulator.push_back(op);

test/SIL/ownership-verifier/load_borrow_invalidation_test.sil

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,3 +272,106 @@ bb0(%0 : $Builtin.RawPointer):
272272
%9999 = tuple()
273273
return %9999 : $()
274274
}
275+
276+
////////////////////////
277+
// Address Cast Tests //
278+
////////////////////////
279+
280+
sil [ossa] @unconditional_checked_cast_addr_test : $@convention(thin) (@in Builtin.NativeObject) -> () {
281+
bb0(%0 : $*Builtin.NativeObject):
282+
%0a = load_borrow %0 : $*Builtin.NativeObject
283+
end_borrow %0a : $Builtin.NativeObject
284+
285+
%stack0 = alloc_stack $Builtin.NativeObject
286+
unconditional_checked_cast_addr Builtin.NativeObject in %0 : $*Builtin.NativeObject to Builtin.NativeObject in %stack0 : $*Builtin.NativeObject
287+
destroy_addr %stack0 : $*Builtin.NativeObject
288+
dealloc_stack %stack0 : $*Builtin.NativeObject
289+
%9999 = tuple()
290+
return %9999 : $()
291+
}
292+
293+
sil [ossa] @conditional_addr_cast_always_take : $@convention(thin) (@in Builtin.NativeObject) -> () {
294+
bb0(%0 : $*Builtin.NativeObject):
295+
%0a = load_borrow %0 : $*Builtin.NativeObject
296+
end_borrow %0a : $Builtin.NativeObject
297+
298+
%stack0 = alloc_stack $Builtin.NativeObject
299+
checked_cast_addr_br take_always Builtin.NativeObject in %0 : $*Builtin.NativeObject to Builtin.NativeObject in %stack0 : $*Builtin.NativeObject, bb1, bb2
300+
301+
bb1:
302+
br bb3
303+
304+
bb2:
305+
br bb3
306+
307+
bb3:
308+
destroy_addr %stack0 : $*Builtin.NativeObject
309+
dealloc_stack %stack0 : $*Builtin.NativeObject
310+
%9999 = tuple()
311+
return %9999 : $()
312+
}
313+
314+
sil [ossa] @conditional_addr_cast_take_on_success : $@convention(thin) (@in Builtin.NativeObject) -> () {
315+
bb0(%0 : $*Builtin.NativeObject):
316+
%0a = load_borrow %0 : $*Builtin.NativeObject
317+
end_borrow %0a : $Builtin.NativeObject
318+
319+
%stack0 = alloc_stack $Builtin.NativeObject
320+
checked_cast_addr_br take_on_success Builtin.NativeObject in %0 : $*Builtin.NativeObject to Builtin.NativeObject in %stack0 : $*Builtin.NativeObject, bb1, bb2
321+
322+
bb1:
323+
destroy_addr %stack0 : $*Builtin.NativeObject
324+
br bb3
325+
326+
bb2:
327+
br bb3
328+
329+
bb3:
330+
dealloc_stack %stack0 : $*Builtin.NativeObject
331+
%9999 = tuple()
332+
return %9999 : $()
333+
}
334+
335+
sil [ossa] @conditional_addr_cast_copyonsuccess_1 : $@convention(thin) (@in Builtin.NativeObject) -> () {
336+
bb0(%0 : $*Builtin.NativeObject):
337+
%0a = load_borrow %0 : $*Builtin.NativeObject
338+
end_borrow %0a : $Builtin.NativeObject
339+
340+
%stack0 = alloc_stack $Builtin.NativeObject
341+
checked_cast_addr_br copy_on_success Builtin.NativeObject in %0 : $*Builtin.NativeObject to Builtin.NativeObject in %stack0 : $*Builtin.NativeObject, bb1, bb2
342+
343+
bb1:
344+
destroy_addr %stack0 : $*Builtin.NativeObject
345+
br bb3
346+
347+
bb2:
348+
br bb3
349+
350+
bb3:
351+
dealloc_stack %stack0 : $*Builtin.NativeObject
352+
destroy_addr %0 : $*Builtin.NativeObject
353+
%9999 = tuple()
354+
return %9999 : $()
355+
}
356+
357+
sil [ossa] @conditional_addr_cast_copyonsuccess_2 : $@convention(thin) (@in Builtin.NativeObject) -> () {
358+
bb0(%0 : $*Builtin.NativeObject):
359+
%0a = load_borrow %0 : $*Builtin.NativeObject
360+
361+
%stack0 = alloc_stack $Builtin.NativeObject
362+
checked_cast_addr_br copy_on_success Builtin.NativeObject in %0 : $*Builtin.NativeObject to Builtin.NativeObject in %stack0 : $*Builtin.NativeObject, bb1, bb2
363+
364+
bb1:
365+
destroy_addr %stack0 : $*Builtin.NativeObject
366+
br bb3
367+
368+
bb2:
369+
br bb3
370+
371+
bb3:
372+
dealloc_stack %stack0 : $*Builtin.NativeObject
373+
end_borrow %0a : $Builtin.NativeObject
374+
destroy_addr %0 : $*Builtin.NativeObject
375+
%9999 = tuple()
376+
return %9999 : $()
377+
}

0 commit comments

Comments
 (0)