Skip to content

Commit 3517652

Browse files
bors[bot]vext01
andauthored
74: Stuff required for AOT optimisations. r=ptersilie a=vext01 Co-authored-by: Edd Barrett <vext01@gmail.com>
2 parents 23597b1 + ddc9c1e commit 3517652

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

llvm/include/llvm/Support/Yk.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ namespace llvm {
55
void initYkOptions(void);
66
} // namespace llvm
77

8+
// YKFIXME: all of our command-line arguments should be collected here instead
9+
// of us randomly introducing `extern bool`s all over the place.
10+
extern bool YkOptNoneAfterIRPasses;
11+
812
#endif

llvm/lib/LTO/LTOBackend.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "llvm/Support/ThreadPool.h"
4040
#include "llvm/Support/ToolOutputFile.h"
4141
#include "llvm/Support/raw_ostream.h"
42+
#include "llvm/Support/Yk.h"
4243
#include "llvm/Target/TargetMachine.h"
4344
#include "llvm/Transforms/IPO/WholeProgramDevirt.h"
4445
#include "llvm/Transforms/Scalar/LoopPassManager.h"
@@ -509,6 +510,16 @@ Error lto::backend(const Config &C, AddStreamFn AddStream,
509510
return Error::success();
510511
}
511512

513+
// Yk can't tolerate backend optimisations, so we mark every function with
514+
// `optnone` from here onwards.
515+
if (YkOptNoneAfterIRPasses) {
516+
for (Function &F: Mod) {
517+
if (!F.isDeclaration()) {
518+
F.addFnAttr(Attribute::OptimizeNone);
519+
}
520+
}
521+
}
522+
512523
if (ParallelCodeGenParallelismLevel == 1) {
513524
codegen(C, TM.get(), AddStream, 0, Mod, CombinedIndex);
514525
} else {

llvm/lib/Support/Yk.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,27 @@ static ManagedStatic<cl::opt<bool, true>,
9696
CreateYkStackmapsSpillReloadsFixParser>
9797
YkStackmapsSpillFixParser;
9898

99+
bool YkOptNoneAfterIRPasses;
100+
namespace {
101+
struct CreateYkOptNoneAfterIRPassesParser {
102+
static void *call() {
103+
return new cl::opt<bool, true>(
104+
"yk-optnone-after-ir-passes",
105+
cl::desc(
106+
"Apply `optnone` to all functions prior to instruction selection."),
107+
cl::NotHidden, cl::location(YkOptNoneAfterIRPasses));
108+
}
109+
};
110+
} // namespace
111+
static ManagedStatic<cl::opt<bool, true>,
112+
CreateYkOptNoneAfterIRPassesParser> YkOptNoneAfterIRPassesParser;
113+
99114
void llvm::initYkOptions() {
100115
*YkAllocLLVMBCSectionParser;
101116
*YkAllocLLVMBBAddrMapSectionParser;
102117
*YkExtendedLLVMBBAddrMapSectionParser;
103118
*YkStackMapOffsetFixParser;
104119
*YkStackMapAdditionalLocsParser;
105120
*YkStackmapsSpillFixParser;
121+
*YkOptNoneAfterIRPassesParser;
106122
}

0 commit comments

Comments
 (0)