mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge pull request #78824 from meg-gupta/fixmdi
Fix operand ownership of mark_dependence [nonescaping] of address values
This commit is contained in:
@@ -823,6 +823,7 @@ public:
|
||||
RefTailAddr,
|
||||
OpenExistentialBox,
|
||||
ProjectBox,
|
||||
MarkDependenceNonEscaping,
|
||||
};
|
||||
|
||||
private:
|
||||
@@ -851,6 +852,12 @@ public:
|
||||
return Kind::OpenExistentialBox;
|
||||
case SILInstructionKind::ProjectBoxInst:
|
||||
return Kind::ProjectBox;
|
||||
case SILInstructionKind::MarkDependenceInst: {
|
||||
auto *mdi = cast<MarkDependenceInst>(use->getUser());
|
||||
return mdi->isNonEscaping() && mdi->getType().isAddress()
|
||||
? Kind::MarkDependenceNonEscaping
|
||||
: Kind::Invalid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -869,6 +876,12 @@ public:
|
||||
return Kind::OpenExistentialBox;
|
||||
case ValueKind::ProjectBoxInst:
|
||||
return Kind::ProjectBox;
|
||||
case ValueKind::MarkDependenceInst: {
|
||||
auto *mdi = cast<MarkDependenceInst>(value->getDefiningInstruction());
|
||||
return mdi->isNonEscaping() && mdi->getType().isAddress()
|
||||
? Kind::MarkDependenceNonEscaping
|
||||
: Kind::Invalid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -931,6 +944,13 @@ struct InteriorPointerOperand {
|
||||
&cast<SingleValueInstruction>(resultValue)->getAllOperands()[0];
|
||||
return InteriorPointerOperand(op, kind);
|
||||
}
|
||||
case InteriorPointerOperandKind::MarkDependenceNonEscaping: {
|
||||
auto *mdi =
|
||||
cast<MarkDependenceInst>(resultValue->getDefiningInstruction());
|
||||
assert(mdi->isNonEscaping() && mdi->getType().isAddress());
|
||||
return InteriorPointerOperand(
|
||||
&mdi->getAllOperands()[MarkDependenceInst::Base], kind);
|
||||
}
|
||||
}
|
||||
llvm_unreachable("covered switch");
|
||||
}
|
||||
@@ -968,6 +988,8 @@ struct InteriorPointerOperand {
|
||||
return cast<OpenExistentialBoxInst>(operand->getUser());
|
||||
case InteriorPointerOperandKind::ProjectBox:
|
||||
return cast<ProjectBoxInst>(operand->getUser());
|
||||
case InteriorPointerOperandKind::MarkDependenceNonEscaping:
|
||||
return cast<MarkDependenceInst>(operand->getUser());
|
||||
}
|
||||
llvm_unreachable("Covered switch isn't covered?!");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user