Force sequential parsing when threads=0.
When threads=0, it doesn't pay to run a parallel parse, since each
parallel parse slows down parsing by requiring a copy of bits in the
function block.
BUG=None
R=stichnot@chromium.org
Review URL: https://codereview.chromium.org/1848873002 .
diff --git a/src/IceClFlags.h b/src/IceClFlags.h
index 59be158..bf51999 100644
--- a/src/IceClFlags.h
+++ b/src/IceClFlags.h
@@ -130,6 +130,9 @@
public:
bool isSequential() const { return NumTranslationThreads == 0; }
+ bool isParseParallel() const {
+ return getParseParallel() && !isSequential() && getBuildOnRead();
+ }
std::string getAppName() const { return AppName; }
void setAppName(const std::string &Value) { AppName = Value; }
diff --git a/src/IceGlobalContext.cpp b/src/IceGlobalContext.cpp
index eb71df1..9d5b25c 100644
--- a/src/IceGlobalContext.cpp
+++ b/src/IceGlobalContext.cpp
@@ -287,11 +287,11 @@
ELFStreamer *ELFStr)
: Strings(new StringPool()), ConstPool(new ConstantPool()), ErrorStatus(),
StrDump(OsDump), StrEmit(OsEmit), StrError(OsError), IntrinsicsInfo(this),
- ObjectWriter(), OptQ(/*Sequential=*/Flags.isSequential(),
- /*MaxSize=*/
- (Flags.getParseParallel() && Flags.getBuildOnRead())
- ? MaxOptQSize
- : Flags.getNumTranslationThreads()),
+ ObjectWriter(),
+ OptQ(/*Sequential=*/Flags.isSequential(),
+ /*MaxSize=*/
+ Flags.isParseParallel() ? MaxOptQSize
+ : Flags.getNumTranslationThreads()),
// EmitQ is allowed unlimited size.
EmitQ(/*Sequential=*/Flags.isSequential()),
DataLowering(TargetDataLowering::createLowering(this)) {
diff --git a/src/PNaClTranslator.cpp b/src/PNaClTranslator.cpp
index be88b7f..65b8a5c 100644
--- a/src/PNaClTranslator.cpp
+++ b/src/PNaClTranslator.cpp
@@ -2995,7 +2995,8 @@
ModuleParser(unsigned BlockID, TopLevelParser *Context)
: BlockParserBaseClass(BlockID, Context),
Timer(Ice::TimerStack::TT_parseModule,
- Context->getTranslator().getContext()) {}
+ Context->getTranslator().getContext()),
+ IsParseParallel(Ice::GlobalContext::Flags.isParseParallel()) {}
~ModuleParser() override = default;
const char *getBlockName() const override { return "module"; }
NaClBitstreamCursor &getCursor() const { return Record.GetCursor(); }
@@ -3007,6 +3008,7 @@
bool GlobalDeclarationNamesAndInitializersInstalled = false;
// True if we have already processed the symbol table for the module.
bool FoundValuesymtab = false;
+ const bool IsParseParallel;
// Generates names for unnamed global addresses (i.e. functions and global
// variables). Then lowers global variable declaration initializers to the
@@ -3148,7 +3150,7 @@
Ice::GlobalContext *Ctx = Context->getTranslator().getContext();
uint32_t SeqNumber = Context->getTranslator().getNextSequenceNumber();
NaClBcIndexSize_t FcnId = Context->getNextFunctionBlockValueID();
- if (Ctx->getFlags().getParseParallel()) {
+ if (IsParseParallel) {
// Skip the block and copy into a buffer. Note: We copy into a buffer
// using the top-level parser to make sure that the underlying
// buffer reading from the data streamer is not thread safe.