Skip to content

Commit 390ba41

Browse files
committed
Add an effects(releasenone) function effects attribute
A ``@effects(releasenone)`` function might read/write global state but does not perform a release.
1 parent d6da4f7 commit 390ba41

File tree

10 files changed

+23
-9
lines changed

10 files changed

+23
-9
lines changed

include/swift/AST/AttrKind.h

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ enum class InlineKind : uint8_t {
7373
enum class EffectsKind : uint8_t {
7474
ReadNone,
7575
ReadOnly,
76+
ReleaseNone,
7677
ReadWrite,
7778
Unspecified
7879
};

include/swift/Serialization/ModuleFormat.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ const uint16_t VERSION_MAJOR = 0;
5555
/// describe what change you made. The content of this comment isn't important;
5656
/// it just ensures a conflict if two people change the module format.
5757
/// Don't worry about adhering to the 80-column limit for this line.
58-
const uint16_t VERSION_MINOR = 401; // Last change: ValueOwnership
58+
const uint16_t VERSION_MINOR = 402; // Last change: effects(releasenone)
5959

6060
using DeclIDField = BCFixed<31>;
6161

lib/AST/Attr.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,9 @@ StringRef DeclAttribute::getAttrName() const {
601601
return "effects(readnone)";
602602
case EffectsKind::ReadOnly:
603603
return "effects(readonly)";
604-
case EffectsKind::ReadWrite:
604+
case EffectsKind::ReleaseNone:
605+
return "effects(releasenone)";
606+
case EffectsKind::ReadWrite:
605607
return "effects(readwrite)";
606608
case EffectsKind::Unspecified:
607609
return "effects(unspecified)";

lib/Parse/ParseDecl.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,8 @@ bool Parser::parseNewDeclAttribute(DeclAttributes &Attributes, SourceLoc AtLoc,
583583
kind = EffectsKind::ReadNone;
584584
else if (Tok.getText() == "readwrite")
585585
kind = EffectsKind::ReadWrite;
586+
else if (Tok.getText() == "releasenone")
587+
kind = EffectsKind::ReleaseNone;
586588
else {
587589
diagnose(Loc, diag::effects_attribute_unknown_option,
588590
Tok.getText(), AttrName);

lib/ParseSIL/ParseSIL.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,8 @@ static bool parseDeclSILOptional(bool *isTransparent,
936936
*MRK = EffectsKind::ReadOnly;
937937
else if (MRK && SP.P.Tok.getText() == "readwrite")
938938
*MRK = EffectsKind::ReadWrite;
939+
else if (MRK && SP.P.Tok.getText() == "releasenone")
940+
*MRK = EffectsKind::ReleaseNone;
939941
else if (Semantics && SP.P.Tok.getText() == "_semantics") {
940942
SP.P.consumeToken(tok::identifier);
941943
if (SP.P.Tok.getKind() != tok::string_literal) {

lib/SIL/SILPrinter.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -2307,8 +2307,10 @@ void SILFunction::print(SILPrintContext &PrintCtx) const {
23072307
OS << "[readonly] ";
23082308
else if (getEffectsKind() == EffectsKind::ReadNone)
23092309
OS << "[readnone] ";
2310-
if (getEffectsKind() == EffectsKind::ReadWrite)
2310+
else if (getEffectsKind() == EffectsKind::ReadWrite)
23112311
OS << "[readwrite] ";
2312+
else if (getEffectsKind() == EffectsKind::ReleaseNone)
2313+
OS << "[releasenone] ";
23122314

23132315
for (auto &Attr : getSemanticsAttrs())
23142316
OS << "[_semantics \"" << Attr << "\"] ";

lib/SILOptimizer/Analysis/SideEffectAnalysis.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,11 @@ bool SideEffectAnalysis::getDefinedEffects(FunctionEffects &Effects,
159159
return true;
160160
}
161161
switch (F->getEffectsKind()) {
162+
case EffectsKind::ReleaseNone:
163+
Effects.GlobalEffects.Reads = true;
164+
Effects.GlobalEffects.Writes = true;
165+
Effects.GlobalEffects.Releases = false;
166+
return true;
162167
case EffectsKind::ReadNone:
163168
return true;
164169
case EffectsKind::ReadOnly:

lib/SILOptimizer/SILCombiner/SILCombinerApplyVisitors.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -1317,7 +1317,7 @@ SILInstruction *SILCombiner::visitApplyInst(ApplyInst *AI) {
13171317

13181318
// Optimize readonly functions with no meaningful users.
13191319
SILFunction *SF = AI->getReferencedFunction();
1320-
if (SF && SF->getEffectsKind() < EffectsKind::ReadWrite) {
1320+
if (SF && SF->getEffectsKind() < EffectsKind::ReleaseNone) {
13211321
UserListTy Users;
13221322
if (recursivelyCollectARCUsers(Users, AI)) {
13231323
if (eraseApply(AI, Users))
@@ -1327,7 +1327,7 @@ SILInstruction *SILCombiner::visitApplyInst(ApplyInst *AI) {
13271327
}
13281328

13291329
if (SF) {
1330-
if (SF->getEffectsKind() < EffectsKind::ReadWrite) {
1330+
if (SF->getEffectsKind() < EffectsKind::ReleaseNone) {
13311331
// Try to optimize string concatenation.
13321332
if (auto I = optimizeConcatenationOfStringLiterals(AI)) {
13331333
return I;
@@ -1450,7 +1450,7 @@ SILInstruction *SILCombiner::visitTryApplyInst(TryApplyInst *AI) {
14501450

14511451
// Optimize readonly functions with no meaningful users.
14521452
SILFunction *Fn = AI->getReferencedFunction();
1453-
if (Fn && Fn->getEffectsKind() < EffectsKind::ReadWrite) {
1453+
if (Fn && Fn->getEffectsKind() < EffectsKind::ReleaseNone) {
14541454
UserListTy Users;
14551455
if (isTryApplyResultNotUsed(Users, AI)) {
14561456
SILBasicBlock *BB = AI->getParent();

lib/SILOptimizer/Utils/Local.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -693,8 +693,8 @@ bool StringConcatenationOptimizer::extractStringConcatOperands() {
693693
auto *FRILeftFun = FRILeft->getReferencedFunction();
694694
auto *FRIRightFun = FRIRight->getReferencedFunction();
695695

696-
if (FRILeftFun->getEffectsKind() >= EffectsKind::ReadWrite ||
697-
FRIRightFun->getEffectsKind() >= EffectsKind::ReadWrite)
696+
if (FRILeftFun->getEffectsKind() >= EffectsKind::ReleaseNone ||
697+
FRIRightFun->getEffectsKind() >= EffectsKind::ReleaseNone)
698698
return false;
699699

700700
if (!FRILeftFun->hasSemanticsAttrs() || !FRIRightFun->hasSemanticsAttrs())

lib/Serialization/SILFormat.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ namespace sil_block {
289289
BCFixed<1>, // global_init
290290
BCFixed<2>, // inlineStrategy
291291
BCFixed<2>, // optimizationMode
292-
BCFixed<2>, // side effect info.
292+
BCFixed<3>, // side effect info.
293293
BCVBR<8>, // number of specialize attributes
294294
BCFixed<1>, // has qualified ownership
295295
BCFixed<1>, // must be weakly referenced

0 commit comments

Comments
 (0)