Skip to content

Commit 91ec64d

Browse files
authored
Merge pull request #65305 from atrick/complete-lifetime
Preliminary test cases for OSSA lifetime completion
2 parents 578c63a + 7093f9a commit 91ec64d

File tree

2 files changed

+89
-1
lines changed

2 files changed

+89
-1
lines changed

lib/SIL/Parser/ParseSIL.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ static llvm::cl::opt<bool>
5353
llvm::cl::desc("Disable verification of input SIL"),
5454
llvm::cl::init(false));
5555

56+
// Option for testing -silgen-cleanup -enable-complete-ossa
57+
static llvm::cl::opt<bool>
58+
ParseIncompleteOSSA("parse-incomplete-ossa",
59+
llvm::cl::desc("Parse OSSA with incomplete lifetimes"));
60+
5661
//===----------------------------------------------------------------------===//
5762
// SILParserState implementation
5863
//===----------------------------------------------------------------------===//
@@ -7043,7 +7048,7 @@ bool SILParserState::parseDeclSIL(Parser &P) {
70437048

70447049
// If SIL parsing succeeded, verify the generated SIL.
70457050
if (!P.Diags.hadAnyError() && !DisableInputVerify)
7046-
FunctionState.F->verify();
7051+
FunctionState.F->verify(/*SingleFunction=*/true, !ParseIncompleteOSSA);
70477052

70487053
return false;
70497054
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// RUN: %target-sil-opt -opt-mode=none -silgen-cleanup -enable-ossa-complete-lifetimes -parse-incomplete-ossa -sil-verify-all %s | %FileCheck %s --check-prefix=CHECK
2+
3+
import Builtin
4+
5+
sil_stage raw
6+
7+
typealias AnyObject = Builtin.AnyObject
8+
9+
class Klass {
10+
var property: Builtin.Int64
11+
}
12+
class SubKlass : Klass {}
13+
14+
enum FakeOptional<T> {
15+
case none
16+
case some(T)
17+
}
18+
19+
struct Int {
20+
var _value : Builtin.Int32
21+
}
22+
23+
struct UInt8 {
24+
var _value : Builtin.Int8
25+
}
26+
27+
protocol P : AnyObject {}
28+
29+
// =============================================================================
30+
// Test complete OSSA lifetimes
31+
// =============================================================================
32+
33+
sil @unreachableHandler : $@convention(thin) () -> ()
34+
35+
// CHECK-LABEL: sil [ossa] @testCompleteOSSALifetimes : $@convention(thin) (@owned FakeOptional<Klass>) -> () {
36+
// CHECK: [[BOX:%.*]] = alloc_box ${ var FakeOptional<Klass> }, var, name "c"
37+
// CHECK: [[BORROW:%.,*]] = begin_borrow [lexical] [[BOX]] : ${ var FakeOptional<Klass> }
38+
// CHECK: bb2:
39+
// CHECK: apply
40+
// CHECK: end_borrow [[BORROW]] : ${ var FakeOptional<Klass> }
41+
// CHECK: destroy_value [[BOX]] : ${ var FakeOptional<Klass> }
42+
// CHECK: unreachable
43+
sil [ossa] @testCompleteOSSALifetimes : $@convention(thin) (@owned FakeOptional<Klass>) -> () {
44+
bb0(%0 : @owned $FakeOptional<Klass>):
45+
%box = alloc_box ${ var FakeOptional<Klass> }, var, name "c"
46+
%borrow = begin_borrow [lexical] %box : ${ var FakeOptional<Klass> }
47+
%project = project_box %borrow : ${ var FakeOptional<Klass> }, 0
48+
store %0 to [init] %project : $*FakeOptional<Klass>
49+
cond_br undef, bb1, bb4
50+
51+
bb1:
52+
%access = begin_access [read] [unknown] %project : $*FakeOptional<Klass>
53+
%val = load [copy] %access : $*FakeOptional<Klass>
54+
end_access %access : $*FakeOptional<Klass>
55+
switch_enum %val : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb3, case #FakeOptional.none!enumelt: bb2
56+
57+
bb2:
58+
%21 = function_ref @unreachableHandler : $@convention(thin) () -> ()
59+
%22 = apply %21() : $@convention(thin) () -> ()
60+
unreachable
61+
62+
bb3(%24 : @owned $Klass):
63+
destroy_value %24 : $Klass
64+
br bb5
65+
66+
bb4:
67+
br bb5
68+
69+
bb5:
70+
end_borrow %borrow : ${ var FakeOptional<Klass> }
71+
destroy_value %box : ${ var FakeOptional<Klass> }
72+
%36 = tuple ()
73+
return %36 : $()
74+
}
75+
76+
// CHECK-LABEL: sil [ossa] @testExistentialLifetime : $@convention(thin) (@owned any P) -> @owned AnyObject {
77+
// CHECK-NOT: destroy
78+
sil [ossa] @testExistentialLifetime : $@convention(thin) (@owned any P) -> @owned AnyObject {
79+
bb0(%0 : @owned $any P):
80+
%1 = open_existential_ref %0 : $any P to $@opened("34B79428-2E49-11ED-901A-8AC134504E1C", any P) Self
81+
%2 = init_existential_ref %1 : $@opened("34B79428-2E49-11ED-901A-8AC134504E1C", any P) Self : $@opened("34B79428-2E49-11ED-901A-8AC134504E1C", any P) Self, $AnyObject
82+
return %2 : $AnyObject
83+
}

0 commit comments

Comments
 (0)