Skip to content

Commit 337c4e8

Browse files
authored
Add a new -sil-disable-only-function flag (#32622)
This will enable us apply -sil-disable-pass only on certain functions
1 parent 35eab3e commit 337c4e8

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

lib/SILOptimizer/PassManager/PassManager.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ llvm::cl::list<std::string>
8787
SILDisablePass("sil-disable-pass", llvm::cl::CommaSeparated,
8888
llvm::cl::desc("Disable passes "
8989
"which contain a string from this list"));
90+
llvm::cl::list<std::string> SILDisablePassOnlyFun(
91+
"sil-disable-pass-only-function", llvm::cl::CommaSeparated,
92+
llvm::cl::desc("Apply -sil-disable-pass only on this function"));
9093

9194
llvm::cl::list<std::string> SILVerifyBeforePass(
9295
"sil-verify-before-pass", llvm::cl::CommaSeparated,
@@ -204,7 +207,13 @@ static bool doPrintAfter(SILTransform *T, SILFunction *F, bool Default) {
204207
return Default;
205208
}
206209

207-
static bool isDisabled(SILTransform *T) {
210+
static bool isDisabled(SILTransform *T, SILFunction *F = nullptr) {
211+
if (!SILDisablePassOnlyFun.empty() && F &&
212+
SILDisablePassOnlyFun.end() == std::find(SILDisablePassOnlyFun.begin(),
213+
SILDisablePassOnlyFun.end(),
214+
F->getName()))
215+
return false;
216+
208217
for (const std::string &NamePattern : SILDisablePass) {
209218
if (T->getTag().find(NamePattern) != StringRef::npos
210219
|| T->getID().find(NamePattern) != StringRef::npos) {
@@ -395,7 +404,7 @@ void SILPassManager::runPassOnFunction(unsigned TransIdx, SILFunction *F) {
395404
return;
396405
}
397406

398-
if (isDisabled(SFT)) {
407+
if (isDisabled(SFT, F)) {
399408
if (SILPrintPassName)
400409
dumpPassInfo("(Disabled)", TransIdx, F);
401410
return;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// RUN: %target-swift-frontend -emit-sil %s -Xllvm -sil-disable-pass=AllocBoxToStack -Xllvm -sil-disable-pass-only-function='$s26testflag_disable_pass_only4foo1yyF' | %FileCheck %s
2+
3+
// CHECK-LABEL: sil hidden [noinline] @$s26testflag_disable_pass_only4foo1yyF :
4+
// CHECK: alloc_box
5+
// CHECK-LABEL: } // end sil function '$s26testflag_disable_pass_only4foo1yyF'
6+
@inline(never)
7+
func foo1() {
8+
var a = 100
9+
@inline(never)
10+
func bar() {
11+
print(a)
12+
}
13+
}
14+
15+
// CHECK-LABEL: sil hidden [noinline] @$s26testflag_disable_pass_only4foo2yyF :
16+
// CHECK-NOT: alloc_box
17+
// CHECK-LABEL: } // end sil function '$s26testflag_disable_pass_only4foo2yyF'
18+
@inline(never)
19+
func foo2() {
20+
var a = 100
21+
@inline(never)
22+
func bar() {
23+
print(a)
24+
}
25+
}

0 commit comments

Comments
 (0)