Skip to content

Commit c03a1b7

Browse files
authored
Merge pull request #22036 from gottesmm/pr-f363d97a4d46da0b3e1b87f8c9e145d1c7b915ec
2 parents 27fd0a7 + 628d761 commit c03a1b7

File tree

2 files changed

+49
-13
lines changed

2 files changed

+49
-13
lines changed

lib/SILOptimizer/Mandatory/PMOMemoryUseCollector.cpp

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -239,21 +239,36 @@ bool ElementUseCollector::collectUses(SILValue Pointer) {
239239
}
240240

241241
// Stores *to* the allocation are writes.
242-
if (isa<StoreInst>(User) && UI->getOperandNumber() == 1) {
243-
if (PointeeType.is<TupleType>()) {
244-
UsesToScalarize.push_back(User);
242+
if (auto *si = dyn_cast<StoreInst>(User)) {
243+
if (UI->getOperandNumber() == StoreInst::Dest) {
244+
if (PointeeType.is<TupleType>()) {
245+
UsesToScalarize.push_back(User);
246+
continue;
247+
}
248+
249+
auto kind = ([&]() -> PMOUseKind {
250+
switch (si->getOwnershipQualifier()) {
251+
// Coming out of SILGen, we assume that raw stores are
252+
// initializations, unless they have trivial type (which we classify
253+
// as InitOrAssign).
254+
case StoreOwnershipQualifier::Unqualified:
255+
if (PointeeType.isTrivial(User->getModule()))
256+
return PMOUseKind::InitOrAssign;
257+
return PMOUseKind::Initialization;
258+
259+
case StoreOwnershipQualifier::Init:
260+
return PMOUseKind::Initialization;
261+
262+
case StoreOwnershipQualifier::Assign:
263+
return PMOUseKind::Assign;
264+
265+
case StoreOwnershipQualifier::Trivial:
266+
return PMOUseKind::InitOrAssign;
267+
}
268+
})();
269+
Uses.emplace_back(si, kind);
245270
continue;
246271
}
247-
248-
// Coming out of SILGen, we assume that raw stores are initializations,
249-
// unless they have trivial type (which we classify as InitOrAssign).
250-
auto Kind = ([&]() -> PMOUseKind {
251-
if (PointeeType.isTrivial(User->getModule()))
252-
return PMOUseKind::InitOrAssign;
253-
return PMOUseKind::Initialization;
254-
})();
255-
Uses.emplace_back(User, Kind);
256-
continue;
257272
}
258273

259274
if (auto *CAI = dyn_cast<CopyAddrInst>(User)) {

test/SILOptimizer/predictable_memaccess_opts.sil

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,27 @@ bb0(%0 : @owned $KlassAndTuple):
441441
return %4 : $Klass
442442
}
443443

444+
// CHECK-LABEL: sil [ossa] @simple_assignstore : $@convention(thin) (@owned Klass, @owned Klass) -> @owned Klass {
445+
// CHECK: bb0([[ARG0:%.*]] : @owned $Klass, [[ARG1:%.*]] : @owned $Klass):
446+
// CHECK: [[STACK:%.*]] = alloc_stack $Klass
447+
// CHECK: store [[ARG0]] to [init] [[STACK]]
448+
// CHECK: [[ARG1_COPY:%.*]] = copy_value [[ARG1]]
449+
// CHECK: store [[ARG1]] to [assign] [[STACK]]
450+
// CHECK: destroy_addr [[STACK]]
451+
// CHECK: dealloc_stack [[STACK]]
452+
// CHECK: return [[ARG1_COPY]]
453+
// CHECK: } // end sil function 'simple_assignstore'
454+
sil [ossa] @simple_assignstore : $@convention(thin) (@owned Klass, @owned Klass) -> @owned Klass {
455+
bb0(%0 : @owned $Klass, %1 : @owned $Klass):
456+
%2 = alloc_stack $Klass
457+
store %0 to [init] %2 : $*Klass
458+
store %1 to [assign] %2 : $*Klass
459+
%3 = load [copy] %2 : $*Klass
460+
destroy_addr %2 : $*Klass
461+
dealloc_stack %2 : $*Klass
462+
return %3 : $Klass
463+
}
464+
444465
////////////////////
445466
// Negative Tests //
446467
////////////////////

0 commit comments

Comments
 (0)