From: Karl Schimpf Date: Thu, 31 Mar 2016 20:22:11 +0000 (-0700) Subject: Force sequential parsing when threads=0. X-Git-Tag: android-x86-7.1-r1~148^2~291 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=3dd127e67b259fbd6d56ae05834b3c2da03e5219;p=android-x86%2Fexternal-swiftshader.git 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 59be15899..bf51999d2 100644 --- a/src/IceClFlags.h +++ b/src/IceClFlags.h @@ -130,6 +130,9 @@ private: 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 eb71df133..9d5b25c7c 100644 --- a/src/IceGlobalContext.cpp +++ b/src/IceGlobalContext.cpp @@ -287,11 +287,11 @@ GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError, 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 be88b7f67..65b8a5c8a 100644 --- a/src/PNaClTranslator.cpp +++ b/src/PNaClTranslator.cpp @@ -2995,7 +2995,8 @@ public: 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 @@ private: 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 @@ bool ModuleParser::ParseBlock(unsigned BlockID) { 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.