diff --git a/include/swift/AST/AttrKind.h b/include/swift/AST/AttrKind.h index 02587e484b2..e80c2c68bad 100644 --- a/include/swift/AST/AttrKind.h +++ b/include/swift/AST/AttrKind.h @@ -73,6 +73,7 @@ enum class InlineKind : uint8_t { enum class EffectsKind : uint8_t { ReadNone, ReadOnly, + ReleaseNone, ReadWrite, Unspecified }; diff --git a/include/swift/Serialization/ModuleFormat.h b/include/swift/Serialization/ModuleFormat.h index 63c1b418b4f..7cd3c725489 100644 --- a/include/swift/Serialization/ModuleFormat.h +++ b/include/swift/Serialization/ModuleFormat.h @@ -55,7 +55,7 @@ const uint16_t VERSION_MAJOR = 0; /// describe what change you made. The content of this comment isn't important; /// it just ensures a conflict if two people change the module format. /// Don't worry about adhering to the 80-column limit for this line. -const uint16_t VERSION_MINOR = 401; // Last change: ValueOwnership +const uint16_t VERSION_MINOR = 402; // Last change: effects(releasenone) using DeclIDField = BCFixed<31>; diff --git a/lib/AST/Attr.cpp b/lib/AST/Attr.cpp index 42d480b3b74..86dbc746bfb 100644 --- a/lib/AST/Attr.cpp +++ b/lib/AST/Attr.cpp @@ -601,7 +601,9 @@ StringRef DeclAttribute::getAttrName() const { return "effects(readnone)"; case EffectsKind::ReadOnly: return "effects(readonly)"; - case EffectsKind::ReadWrite: + case EffectsKind::ReleaseNone: + return "effects(releasenone)"; + case EffectsKind::ReadWrite: return "effects(readwrite)"; case EffectsKind::Unspecified: return "effects(unspecified)"; diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index b2dcd16ec81..2325a716345 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -583,6 +583,8 @@ bool Parser::parseNewDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc, kind = EffectsKind::ReadNone; else if (Tok.getText() == "readwrite") kind = EffectsKind::ReadWrite; + else if (Tok.getText() == "releasenone") + kind = EffectsKind::ReleaseNone; else { diagnose(Loc, diag::effects_attribute_unknown_option, Tok.getText(), AttrName); diff --git a/lib/ParseSIL/ParseSIL.cpp b/lib/ParseSIL/ParseSIL.cpp index 137817c99c2..6f41149cfcd 100644 --- a/lib/ParseSIL/ParseSIL.cpp +++ b/lib/ParseSIL/ParseSIL.cpp @@ -936,6 +936,8 @@ static bool parseDeclSILOptional(bool *isTransparent, *MRK = EffectsKind::ReadOnly; else if (MRK && SP.P.Tok.getText() == "readwrite") *MRK = EffectsKind::ReadWrite; + else if (MRK && SP.P.Tok.getText() == "releasenone") + *MRK = EffectsKind::ReleaseNone; else if (Semantics && SP.P.Tok.getText() == "_semantics") { SP.P.consumeToken(tok::identifier); if (SP.P.Tok.getKind() != tok::string_literal) { diff --git a/lib/SIL/SILPrinter.cpp b/lib/SIL/SILPrinter.cpp index 357f728ca5f..0e08f8c2e3d 100644 --- a/lib/SIL/SILPrinter.cpp +++ b/lib/SIL/SILPrinter.cpp @@ -2307,8 +2307,10 @@ void SILFunction::print(SILPrintContext &PrintCtx) const { OS << "[readonly] "; else if (getEffectsKind() == EffectsKind::ReadNone) OS << "[readnone] "; - if (getEffectsKind() == EffectsKind::ReadWrite) + else if (getEffectsKind() == EffectsKind::ReadWrite) OS << "[readwrite] "; + else if (getEffectsKind() == EffectsKind::ReleaseNone) + OS << "[releasenone] "; for (auto &Attr : getSemanticsAttrs()) OS << "[_semantics \"" << Attr << "\"] "; diff --git a/lib/SILOptimizer/Analysis/SideEffectAnalysis.cpp b/lib/SILOptimizer/Analysis/SideEffectAnalysis.cpp index 8d69d663800..a1996f5d0da 100644 --- a/lib/SILOptimizer/Analysis/SideEffectAnalysis.cpp +++ b/lib/SILOptimizer/Analysis/SideEffectAnalysis.cpp @@ -159,6 +159,11 @@ bool SideEffectAnalysis::getDefinedEffects(FunctionEffects &Effects, return true; } switch (F->getEffectsKind()) { + case EffectsKind::ReleaseNone: + Effects.GlobalEffects.Reads = true; + Effects.GlobalEffects.Writes = true; + Effects.GlobalEffects.Releases = false; + return true; case EffectsKind::ReadNone: return true; case EffectsKind::ReadOnly: diff --git a/lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp b/lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp index a7d52cbcf4a..b885c70f728 100644 --- a/lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp +++ b/lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp @@ -1317,7 +1317,7 @@ SILInstruction *SILCombiner::visitApplyInst(ApplyInst *AI) { // Optimize readonly functions with no meaningful users. SILFunction *SF = AI->getReferencedFunction(); - if (SF && SF->getEffectsKind() < EffectsKind::ReadWrite) { + if (SF && SF->getEffectsKind() < EffectsKind::ReleaseNone) { UserListTy Users; if (recursivelyCollectARCUsers(Users, AI)) { if (eraseApply(AI, Users)) @@ -1327,7 +1327,7 @@ SILInstruction *SILCombiner::visitApplyInst(ApplyInst *AI) { } if (SF) { - if (SF->getEffectsKind() < EffectsKind::ReadWrite) { + if (SF->getEffectsKind() < EffectsKind::ReleaseNone) { // Try to optimize string concatenation. if (auto I = optimizeConcatenationOfStringLiterals(AI)) { return I; @@ -1450,7 +1450,7 @@ SILInstruction *SILCombiner::visitTryApplyInst(TryApplyInst *AI) { // Optimize readonly functions with no meaningful users. SILFunction *Fn = AI->getReferencedFunction(); - if (Fn && Fn->getEffectsKind() < EffectsKind::ReadWrite) { + if (Fn && Fn->getEffectsKind() < EffectsKind::ReleaseNone) { UserListTy Users; if (isTryApplyResultNotUsed(Users, AI)) { SILBasicBlock *BB = AI->getParent(); diff --git a/lib/SILOptimizer/Utils/Local.cpp b/lib/SILOptimizer/Utils/Local.cpp index 6bdc9ba8306..a3523b1f8b5 100644 --- a/lib/SILOptimizer/Utils/Local.cpp +++ b/lib/SILOptimizer/Utils/Local.cpp @@ -693,8 +693,8 @@ bool StringConcatenationOptimizer::extractStringConcatOperands() { auto *FRILeftFun = FRILeft->getReferencedFunction(); auto *FRIRightFun = FRIRight->getReferencedFunction(); - if (FRILeftFun->getEffectsKind() >= EffectsKind::ReadWrite || - FRIRightFun->getEffectsKind() >= EffectsKind::ReadWrite) + if (FRILeftFun->getEffectsKind() >= EffectsKind::ReleaseNone || + FRIRightFun->getEffectsKind() >= EffectsKind::ReleaseNone) return false; if (!FRILeftFun->hasSemanticsAttrs() || !FRIRightFun->hasSemanticsAttrs()) diff --git a/lib/Serialization/SILFormat.h b/lib/Serialization/SILFormat.h index a5ed3724a21..03a8cc65e54 100644 --- a/lib/Serialization/SILFormat.h +++ b/lib/Serialization/SILFormat.h @@ -289,7 +289,7 @@ namespace sil_block { BCFixed<1>, // global_init BCFixed<2>, // inlineStrategy BCFixed<2>, // optimizationMode - BCFixed<2>, // side effect info. + BCFixed<3>, // side effect info. BCVBR<8>, // number of specialize attributes BCFixed<1>, // has qualified ownership BCFixed<1>, // must be weakly referenced