File tree Expand file tree Collapse file tree 2 files changed +38
-3
lines changed
lib/SILOptimizer/Mandatory Expand file tree Collapse file tree 2 files changed +38
-3
lines changed Original file line number Diff line number Diff line change @@ -2222,16 +2222,27 @@ bool GatherUsesVisitor::visitUse(Operand *op) {
2222
2222
// Before we do anything, see if this load is of a copyable field or is a
2223
2223
// trivial load. If it is, then we just treat this as a liveness requiring
2224
2224
// use.
2225
- if ( li->getOwnershipQualifier () == LoadOwnershipQualifier::Trivial ||
2226
- isCopyableValue (li)) {
2225
+ auto qualifier = li->getOwnershipQualifier ();
2226
+ if (qualifier == LoadOwnershipQualifier::Trivial || isCopyableValue (li)) {
2227
2227
SmallVector<TypeTreeLeafTypeRange, 2 > leafRanges;
2228
2228
TypeTreeLeafTypeRange::get (op, getRootAddress (), leafRanges);
2229
2229
if (!leafRanges.size ()) {
2230
2230
LLVM_DEBUG (llvm::dbgs () << " Failed to form leaf type range!\n " );
2231
2231
return false ;
2232
2232
}
2233
2233
for (auto leafRange : leafRanges) {
2234
- useState.recordLivenessUse (user, leafRange);
2234
+ switch (qualifier) {
2235
+ case LoadOwnershipQualifier::Unqualified:
2236
+ llvm_unreachable (" unqualified load in ossa!?" );
2237
+ case LoadOwnershipQualifier::Take:
2238
+ useState.recordTakeUse (user, leafRange);
2239
+ break ;
2240
+ case LoadOwnershipQualifier::Copy:
2241
+ LLVM_FALLTHROUGH;
2242
+ case LoadOwnershipQualifier::Trivial:
2243
+ useState.recordLivenessUse (user, leafRange);
2244
+ break ;
2245
+ }
2235
2246
}
2236
2247
return true ;
2237
2248
}
Original file line number Diff line number Diff line change 8
8
// RUN: -move-only-address-checker-disable-lifetime-extension=true \
9
9
// RUN: | %FileCheck %s
10
10
11
+ import Builtin
12
+
11
13
@_moveOnly
12
14
struct M {
13
15
deinit {}
@@ -180,3 +182,25 @@ entry(%m4_addr : $*M4):
180
182
%retval = tuple ()
181
183
return %retval : $()
182
184
}
185
+
186
+ struct S : ~Copyable {
187
+ var o: Builtin.NativeObject
188
+ }
189
+
190
+ // CHECK-LABEL: sil [ossa] @load_take_copyable : {{.*}} {
191
+ // CHECK: bb0([[S:%[^,]+]] :
192
+ // CHECK: [[O_ADDR:%[^,]+]] = struct_element_addr [[S]] : $*S, #S.o
193
+ // CHECK: [[O:%[^,]+]] = load [take] [[O_ADDR]]
194
+ // CHECK: [[OM:%[^,]+]] = move_value [[O]]
195
+ // CHECK: destroy_value [[OM]]
196
+ // CHECK-LABEL: } // end sil function 'load_take_copyable'
197
+ sil [ossa] @load_take_copyable : $@convention(thin) (@in S) -> () {
198
+ bb0(%s_addr : $*S):
199
+ %s = mark_unresolved_non_copyable_value [consumable_and_assignable] %s_addr : $*S
200
+ %o_addr = struct_element_addr %s : $*S, #S.o
201
+ %o = load [take] %o_addr : $*Builtin.NativeObject
202
+ %om = move_value %o : $Builtin.NativeObject
203
+ destroy_value %om : $Builtin.NativeObject
204
+ %retval = tuple ()
205
+ return %retval : $()
206
+ }
You can’t perform that action at this time.
0 commit comments