mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[arc-analysis] ReadNone builtins that do not take values with reference semantics can not use values with reference semantics.
Swift SVN r19909
This commit is contained in:
@@ -147,6 +147,40 @@ bool swift::arc::canDecrementRefCount(SILInstruction *User,
|
|||||||
// Use Analysis
|
// Use Analysis
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
/// Returns true if a builtin apply can not use reference counted values.
|
||||||
|
///
|
||||||
|
/// The main case that this handles here are builtins that via read none imply
|
||||||
|
/// that they can not read globals and at the same time do not take any
|
||||||
|
/// non-trivial types via the arguments.
|
||||||
|
static bool canApplyOfBuiltinUseNonTrivialValues(ApplyInst *AI,
|
||||||
|
BuiltinFunctionRefInst *BFRI) {
|
||||||
|
SILModule &Mod = AI->getModule();
|
||||||
|
|
||||||
|
auto &II = BFRI->getIntrinsicInfo();
|
||||||
|
if (II.ID != llvm::Intrinsic::not_intrinsic) {
|
||||||
|
if (II.hasAttribute(llvm::Attribute::ReadNone)) {
|
||||||
|
for (auto &Op : AI->getArgumentOperands()) {
|
||||||
|
if (!Op.get().getType().isTrivial(Mod)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto &BI = BFRI->getBuiltinInfo();
|
||||||
|
if (BI.isReadNone()) {
|
||||||
|
for (auto &Op : AI->getArgumentOperands()) {
|
||||||
|
if (!Op.get().getType().isTrivial(Mod)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if Inst is a function that we know never uses ref count values.
|
/// Returns true if Inst is a function that we know never uses ref count values.
|
||||||
static bool canInstUseRefCountValues(SILInstruction *Inst) {
|
static bool canInstUseRefCountValues(SILInstruction *Inst) {
|
||||||
switch (Inst->getKind()) {
|
switch (Inst->getKind()) {
|
||||||
@@ -211,6 +245,16 @@ static bool canInstUseRefCountValues(SILInstruction *Inst) {
|
|||||||
case ValueKind::CondFailInst:
|
case ValueKind::CondFailInst:
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case ValueKind::ApplyInst: {
|
||||||
|
auto *AI = cast<ApplyInst>(Inst);
|
||||||
|
|
||||||
|
// Certain builtin function refs we know can never use non-trivial values.
|
||||||
|
if (auto *BFRI = dyn_cast<BuiltinFunctionRefInst>(AI->getCallee()))
|
||||||
|
return canApplyOfBuiltinUseNonTrivialValues(AI, BFRI);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user