Merge pull request #78824 from meg-gupta/fixmdi

Fix operand ownership of mark_dependence [nonescaping] of address values
This commit is contained in:
Meghana Gupta
2025-01-24 14:59:36 -08:00
committed by GitHub
4 changed files with 51 additions and 3 deletions

View File

@@ -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?!");
}