OSDN Git Service

Force sequential parsing when threads=0.
authorKarl Schimpf <kschimpf@google.com>
Thu, 31 Mar 2016 20:22:11 +0000 (13:22 -0700)
committerKarl Schimpf <kschimpf@google.com>
Thu, 31 Mar 2016 20:22:11 +0000 (13:22 -0700)
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 .

src/IceClFlags.h
src/IceGlobalContext.cpp
src/PNaClTranslator.cpp

index 59be158..bf51999 100644 (file)
@@ -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; }
 
index eb71df1..9d5b25c 100644 (file)
@@ -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)) {
index be88b7f..65b8a5c 100644 (file)
@@ -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.