@@ -188,7 +188,8 @@ static bool isAddressForLoad(SILInstruction *I, SILBasicBlock *&singleBlock) {
188
188
if (isa<LoadInst>(I))
189
189
return true ;
190
190
191
- if (!isa<StructElementAddrInst>(I) && !isa<TupleElementAddrInst>(I))
191
+ if (!isa<UncheckedAddrCastInst>(I) && !isa<StructElementAddrInst>(I) &&
192
+ !isa<TupleElementAddrInst>(I))
192
193
return false ;
193
194
194
195
// Recursively search for other (non-)loads in the instruction's uses.
@@ -205,7 +206,8 @@ static bool isAddressForLoad(SILInstruction *I, SILBasicBlock *&singleBlock) {
205
206
206
207
// / Returns true if \p I is a dead struct_element_addr or tuple_element_addr.
207
208
static bool isDeadAddrProjection (SILInstruction *I) {
208
- if (!isa<StructElementAddrInst>(I) && !isa<TupleElementAddrInst>(I))
209
+ if (!isa<UncheckedAddrCastInst>(I) && !isa<StructElementAddrInst>(I) &&
210
+ !isa<TupleElementAddrInst>(I))
209
211
return false ;
210
212
211
213
// Recursively search for uses which are dead themselves.
@@ -311,7 +313,8 @@ static bool isLoadFromStack(SILInstruction *I, AllocStackInst *ASI) {
311
313
// Skip struct and tuple address projections.
312
314
ValueBase *op = I->getOperand (0 );
313
315
while (op != ASI) {
314
- if (!isa<StructElementAddrInst>(op) && !isa<TupleElementAddrInst>(op))
316
+ if (!isa<UncheckedAddrCastInst>(op) && !isa<StructElementAddrInst>(op) &&
317
+ !isa<TupleElementAddrInst>(op))
315
318
return false ;
316
319
317
320
op = cast<SingleValueInstruction>(op)->getOperand (0 );
@@ -325,7 +328,8 @@ static void collectLoads(SILInstruction *I, SmallVectorImpl<LoadInst *> &Loads)
325
328
Loads.push_back (load);
326
329
return ;
327
330
}
328
- if (!isa<StructElementAddrInst>(I) && !isa<TupleElementAddrInst>(I))
331
+ if (!isa<UncheckedAddrCastInst>(I) && !isa<StructElementAddrInst>(I) &&
332
+ !isa<TupleElementAddrInst>(I))
329
333
return ;
330
334
331
335
// Recursively search for other loads in the instruction's uses.
@@ -339,7 +343,8 @@ static void replaceLoad(LoadInst *LI, SILValue val, AllocStackInst *ASI) {
339
343
ProjectionPath projections (val->getType ());
340
344
SILValue op = LI->getOperand ();
341
345
while (op != ASI) {
342
- assert (isa<StructElementAddrInst>(op) || isa<TupleElementAddrInst>(op));
346
+ assert (isa<UncheckedAddrCastInst>(op) || isa<StructElementAddrInst>(op) ||
347
+ isa<TupleElementAddrInst>(op));
343
348
auto *Inst = cast<SingleValueInstruction>(op);
344
349
projections.push_back (Projection (Inst));
345
350
op = Inst->getOperand (0 );
@@ -353,7 +358,8 @@ static void replaceLoad(LoadInst *LI, SILValue val, AllocStackInst *ASI) {
353
358
LI->replaceAllUsesWith (val);
354
359
LI->eraseFromParent ();
355
360
while (op != ASI && op->use_empty ()) {
356
- assert (isa<StructElementAddrInst>(op) || isa<TupleElementAddrInst>(op));
361
+ assert (isa<UncheckedAddrCastInst>(op) || isa<StructElementAddrInst>(op) ||
362
+ isa<TupleElementAddrInst>(op));
357
363
auto *Inst = cast<SingleValueInstruction>(op);
358
364
SILValue next = Inst->getOperand (0 );
359
365
Inst->eraseFromParent ();
@@ -541,7 +547,8 @@ void MemoryToRegisters::removeSingleBlockAllocation(AllocStackInst *ASI) {
541
547
// Remove dead address instructions that may be uses of the allocation.
542
548
SILNode *Node = Inst;
543
549
while (isa<StructElementAddrInst>(Node) ||
544
- isa<TupleElementAddrInst>(Node)) {
550
+ isa<TupleElementAddrInst>(Node) ||
551
+ isa<UncheckedAddrCastInst>(Node)) {
545
552
auto *I = cast<SingleValueInstruction>(Node);
546
553
if (!I->use_empty ()) break ;
547
554
Node = I->getOperand (0 );
0 commit comments