Skip to content

Commit 9f6f93a

Browse files
authored
Merge pull request #33260 from gottesmm/pr-8fc080f91028cba90df6e39440ac91d402da76fd
[ownership] Update SROA to support OSSA.
2 parents 12ffdd3 + 12d652e commit 9f6f93a

File tree

3 files changed

+525
-47
lines changed

3 files changed

+525
-47
lines changed

lib/SILOptimizer/Transforms/SILSROA.cpp

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ class SROAMemoryUseAnalyzer {
6767
private:
6868
SILValue createAgg(SILBuilder &B, SILLocation Loc, SILType Ty,
6969
ArrayRef<SILValue> Elements);
70-
SILValue createAggProjection(SILBuilder &B, SILLocation Loc,
71-
SILValue Operand, unsigned EltNo);
7270
unsigned getEltNoForProjection(SILInstruction *Inst);
7371
void createAllocas(llvm::SmallVector<AllocStackInst *, 4> &NewAllocations);
7472
};
@@ -87,24 +85,6 @@ SROAMemoryUseAnalyzer::createAgg(SILBuilder &B, SILLocation Loc,
8785
return B.createStruct(Loc, Ty, Elements);
8886
}
8987

90-
SILValue
91-
SROAMemoryUseAnalyzer::createAggProjection(SILBuilder &B, SILLocation Loc,
92-
SILValue Operand,
93-
unsigned EltNo) {
94-
if (TT)
95-
return B.createTupleExtract(Loc, Operand, EltNo);
96-
97-
assert(SD && "SD should not be null since either it or TT must be set at "
98-
"this point.");
99-
100-
auto Properties = SD->getStoredProperties();
101-
unsigned Counter = 0;
102-
for (auto *D : Properties)
103-
if (Counter++ == EltNo)
104-
return B.createStructExtract(Loc, Operand, D);
105-
llvm_unreachable("Unknown field.");
106-
}
107-
10888
unsigned SROAMemoryUseAnalyzer::getEltNoForProjection(SILInstruction *Inst) {
10989
if (TT)
11090
return cast<TupleElementAddrInst>(Inst)->getFieldNo();
@@ -249,9 +229,10 @@ void SROAMemoryUseAnalyzer::chopUpAlloca(std::vector<AllocStackInst *> &Worklist
249229
for (auto *LI : Loads) {
250230
SILBuilderWithScope B(LI);
251231
llvm::SmallVector<SILValue, 4> Elements;
252-
for (auto *NewAI : NewAllocations)
253-
Elements.push_back(B.createLoad(LI->getLoc(), NewAI,
254-
LoadOwnershipQualifier::Unqualified));
232+
for (auto *NewAI : NewAllocations) {
233+
Elements.push_back(B.emitLoadValueOperation(LI->getLoc(), NewAI,
234+
LI->getOwnershipQualifier()));
235+
}
255236
SILValue Agg = createAgg(B, LI->getLoc(), LI->getType().getObjectType(),
256237
Elements);
257238
LI->replaceAllUsesWith(Agg);
@@ -260,12 +241,15 @@ void SROAMemoryUseAnalyzer::chopUpAlloca(std::vector<AllocStackInst *> &Worklist
260241

261242
// Change any aggregate stores into extracts + field stores.
262243
for (auto *SI : Stores) {
263-
SILBuilderWithScope B(SI);
264-
for (unsigned EltNo : indices(NewAllocations))
265-
B.createStore(SI->getLoc(),
266-
createAggProjection(B, SI->getLoc(), SI->getSrc(), EltNo),
267-
NewAllocations[EltNo],
268-
StoreOwnershipQualifier::Unqualified);
244+
SILBuilderWithScope builder(SI);
245+
SmallVector<SILValue, 8> destructured;
246+
builder.emitDestructureValueOperation(SI->getLoc(), SI->getSrc(),
247+
destructured);
248+
for (unsigned eltNo : indices(NewAllocations)) {
249+
builder.emitStoreValueOperation(SI->getLoc(), destructured[eltNo],
250+
NewAllocations[eltNo],
251+
StoreOwnershipQualifier::Init);
252+
}
269253
SI->eraseFromParent();
270254
}
271255

@@ -356,10 +340,6 @@ class SILSROA : public SILFunctionTransform {
356340
void run() override {
357341
SILFunction *F = getFunction();
358342

359-
// FIXME: We should be able to handle ownership.
360-
if (F->hasOwnership())
361-
return;
362-
363343
LLVM_DEBUG(llvm::dbgs() << "***** SROA on function: " << F->getName()
364344
<< " *****\n");
365345

test/SILOptimizer/sroa.sil

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ sil @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
2323
// CHECK: [[VAR_2:%[0-9]+]] = alloc_stack $Builtin.Int32
2424
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int64
2525
// CHECK: [[VAR_4:%[0-9]+]] = struct_extract [[VAR_0]] : $S1, #S1.x
26-
// CHECK: store [[VAR_4]] to [[VAR_1]] : $*Builtin.Int1
2726
// CHECK: [[VAR_6:%[0-9]+]] = struct_extract [[VAR_0]] : $S1, #S1.y
28-
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int32
2927
// CHECK: [[VAR_8:%[0-9]+]] = struct_extract [[VAR_0]] : $S1, #S1.z
28+
// CHECK: store [[VAR_4]] to [[VAR_1]] : $*Builtin.Int1
29+
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int32
3030
// CHECK: store [[VAR_8]] to [[VAR_3]] : $*Builtin.Int64
3131
// CHECK: [[VAR_10:%[0-9]+]] = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
3232
// CHECK: [[VAR_11:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
@@ -91,13 +91,13 @@ struct S2 {
9191
// CHECK: [[VAR_4:%[0-9]+]] = alloc_stack $Builtin.Int32
9292
// CHECK: [[VAR_5:%[0-9]+]] = alloc_stack $Builtin.Int64
9393
// CHECK: [[VAR_6:%[0-9]+]] = struct_extract [[VAR_0]] : $S2, #S2.alpha
94-
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.FPIEEE32
9594
// CHECK: [[VAR_8:%[0-9]+]] = struct_extract [[VAR_0]] : $S2, #S2.beta
95+
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.FPIEEE32
9696
// CHECK: [[VAR_9:%[0-9]+]] = struct_extract [[VAR_8]] : $S1, #S1.x
97-
// CHECK: store [[VAR_9]] to [[VAR_3]] : $*Builtin.Int1
9897
// CHECK: [[VAR_11:%[0-9]+]] = struct_extract [[VAR_8]] : $S1, #S1.y
99-
// CHECK: store [[VAR_11]] to [[VAR_4]] : $*Builtin.Int32
10098
// CHECK: [[VAR_13:%[0-9]+]] = struct_extract [[VAR_8]] : $S1, #S1.z
99+
// CHECK: store [[VAR_9]] to [[VAR_3]] : $*Builtin.Int1
100+
// CHECK: store [[VAR_11]] to [[VAR_4]] : $*Builtin.Int32
101101
// CHECK: store [[VAR_13]] to [[VAR_5]] : $*Builtin.Int64
102102
// CHECK: [[VAR_15:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int1
103103
// CHECK: [[VAR_16:%[0-9]+]] = load [[VAR_4]] : $*Builtin.Int32
@@ -159,13 +159,13 @@ struct S3 {
159159
// CHECK: [[VAR_4:%[0-9]+]] = alloc_stack $Builtin.Int16
160160
// CHECK: [[VAR_5:%[0-9]+]] = alloc_stack $Builtin.FPIEEE32
161161
// CHECK: [[VAR_6:%[0-9]+]] = struct_extract [[VAR_0]] : $S3, #S3.gamma
162+
// CHECK: [[VAR_13:%[0-9]+]] = struct_extract [[VAR_0]] : $S3, #S3.delta
162163
// CHECK: [[VAR_7:%[0-9]+]] = tuple_extract [[VAR_6]] : $(Builtin.Int32, Builtin.Int64, Builtin.Int16), 0
163-
// CHECK: store [[VAR_7]] to [[VAR_2]] : $*Builtin.Int32
164164
// CHECK: [[VAR_9:%[0-9]+]] = tuple_extract [[VAR_6]] : $(Builtin.Int32, Builtin.Int64, Builtin.Int16), 1
165-
// CHECK: store [[VAR_9]] to [[VAR_3]] : $*Builtin.Int64
166165
// CHECK: [[VAR_11:%[0-9]+]] = tuple_extract [[VAR_6]] : $(Builtin.Int32, Builtin.Int64, Builtin.Int16), 2
166+
// CHECK: store [[VAR_7]] to [[VAR_2]] : $*Builtin.Int32
167+
// CHECK: store [[VAR_9]] to [[VAR_3]] : $*Builtin.Int64
167168
// CHECK: store [[VAR_11]] to [[VAR_4]] : $*Builtin.Int16
168-
// CHECK: [[VAR_13:%[0-9]+]] = struct_extract [[VAR_0]] : $S3, #S3.delta
169169
// CHECK: store [[VAR_13]] to [[VAR_5]] : $*Builtin.FPIEEE32
170170
// CHECK: [[VAR_15:%[0-9]+]] = function_ref @use_tup : $@convention(thin) ((Builtin.Int32, Builtin.Int64, Builtin.Int16)) -> ()
171171
// CHECK: [[VAR_16:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
@@ -219,10 +219,10 @@ bb0(%0 : $S3, %1 : $Builtin.Int64):
219219
// CHECK: [[VAR_2:%[0-9]+]] = alloc_stack $Builtin.Int32
220220
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int64
221221
// CHECK: [[VAR_4:%[0-9]+]] = tuple_extract [[VAR_0]] : $(Builtin.Int1, Builtin.Int32, Builtin.Int64), 0
222-
// CHECK: store [[VAR_4]] to [[VAR_1]] : $*Builtin.Int1
223222
// CHECK: [[VAR_6:%[0-9]+]] = tuple_extract [[VAR_0]] : $(Builtin.Int1, Builtin.Int32, Builtin.Int64), 1
224-
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int32
225223
// CHECK: [[VAR_8:%[0-9]+]] = tuple_extract [[VAR_0]] : $(Builtin.Int1, Builtin.Int32, Builtin.Int64), 2
224+
// CHECK: store [[VAR_4]] to [[VAR_1]] : $*Builtin.Int1
225+
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int32
226226
// CHECK: store [[VAR_8]] to [[VAR_3]] : $*Builtin.Int64
227227
// CHECK: [[VAR_10:%[0-9]+]] = function_ref @use_int32 : $@convention(thin) (Builtin.Int32) -> ()
228228
// CHECK: [[VAR_11:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int32
@@ -267,11 +267,11 @@ sil @use_str4 : $@convention(thin) (S4) -> ()
267267
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int32
268268
// CHECK: [[VAR_4:%[0-9]+]] = alloc_stack $Builtin.Int16
269269
// CHECK: [[VAR_5:%[0-9]+]] = tuple_extract [[VAR_0]] : $(S4, Builtin.Int16), 0
270+
// CHECK: [[VAR_10:%[0-9]+]] = tuple_extract [[VAR_0]] : $(S4, Builtin.Int16), 1
270271
// CHECK: [[VAR_6:%[0-9]+]] = struct_extract [[VAR_5]] : $S4, #S4.aleph
271-
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int64
272272
// CHECK: [[VAR_8:%[0-9]+]] = struct_extract [[VAR_5]] : $S4, #S4.bet
273+
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int64
273274
// CHECK: store [[VAR_8]] to [[VAR_3]] : $*Builtin.Int32
274-
// CHECK: [[VAR_10:%[0-9]+]] = tuple_extract [[VAR_0]] : $(S4, Builtin.Int16), 1
275275
// CHECK: store [[VAR_10]] to [[VAR_4]] : $*Builtin.Int16
276276
// CHECK: [[VAR_12:%[0-9]+]] = function_ref @use_str4 : $@convention(thin) (S4) -> ()
277277
// CHECK: [[VAR_13:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int64
@@ -325,11 +325,11 @@ sil @use_int16 : $@convention(thin) (Builtin.Int16) -> ()
325325
// CHECK: [[VAR_3:%[0-9]+]] = alloc_stack $Builtin.Int32
326326
// CHECK: [[VAR_4:%[0-9]+]] = alloc_stack $Builtin.Int16
327327
// CHECK: [[VAR_5:%[0-9]+]] = tuple_extract [[VAR_0]] : $((Builtin.Int64, Builtin.Int32), Builtin.Int16), 0
328+
// CHECK: [[VAR_10:%[0-9]+]] = tuple_extract [[VAR_0]] : $((Builtin.Int64, Builtin.Int32), Builtin.Int16), 1
328329
// CHECK: [[VAR_6:%[0-9]+]] = tuple_extract [[VAR_5]] : $(Builtin.Int64, Builtin.Int32), 0
329-
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int64
330330
// CHECK: [[VAR_8:%[0-9]+]] = tuple_extract [[VAR_5]] : $(Builtin.Int64, Builtin.Int32), 1
331+
// CHECK: store [[VAR_6]] to [[VAR_2]] : $*Builtin.Int64
331332
// CHECK: store [[VAR_8]] to [[VAR_3]] : $*Builtin.Int32
332-
// CHECK: [[VAR_10:%[0-9]+]] = tuple_extract [[VAR_0]] : $((Builtin.Int64, Builtin.Int32), Builtin.Int16), 1
333333
// CHECK: store [[VAR_10]] to [[VAR_4]] : $*Builtin.Int16
334334
// CHECK: [[VAR_12:%[0-9]+]] = load [[VAR_2]] : $*Builtin.Int64
335335
// CHECK: [[VAR_13:%[0-9]+]] = load [[VAR_3]] : $*Builtin.Int32

0 commit comments

Comments
 (0)