Chromium Code Reviews| Index: src/IceGlobalContext.h |
| diff --git a/src/IceGlobalContext.h b/src/IceGlobalContext.h |
| index 04f08a2dbffa3191633fb39343b9e6e03f1ef1e0..e8e066960b199507f5e98c37b7e26234d764c2e6 100644 |
| --- a/src/IceGlobalContext.h |
| +++ b/src/IceGlobalContext.h |
| @@ -73,6 +73,13 @@ class GlobalContext { |
| void updateFrameBytes(uint32_t Bytes) { FrameBytes += Bytes; } |
| void updateSpills() { ++Spills; } |
| void updateFills() { ++Fills; } |
| + void add(const CodeStats &Other) { |
| + InstructionsEmitted += Other.InstructionsEmitted; |
| + RegistersSaved += Other.RegistersSaved; |
| + FrameBytes += Other.FrameBytes; |
| + Spills += Other.Spills; |
| + Fills += Other.Fills; |
| + } |
| void dump(const IceString &Name, Ostream &Str); |
| private: |
| @@ -121,6 +128,7 @@ class GlobalContext { |
| public: |
| ThreadContext() {} |
| CodeStats StatsFunction; |
| + CodeStats StatsCumulative; |
| TimerList Timers; |
| }; |
| @@ -210,31 +218,31 @@ public: |
| if (!ALLOW_DUMP || !getFlags().DumpStats) |
| return; |
| ICE_TLS_GET_FIELD(TLS)->StatsFunction.updateEmitted(InstCount); |
| - getStatsCumulative()->updateEmitted(InstCount); |
| + ICE_TLS_GET_FIELD(TLS)->StatsCumulative.updateEmitted(InstCount); |
| } |
| void statsUpdateRegistersSaved(uint32_t Num) { |
| if (!ALLOW_DUMP || !getFlags().DumpStats) |
| return; |
| ICE_TLS_GET_FIELD(TLS)->StatsFunction.updateRegistersSaved(Num); |
| - getStatsCumulative()->updateRegistersSaved(Num); |
| + ICE_TLS_GET_FIELD(TLS)->StatsCumulative.updateRegistersSaved(Num); |
| } |
| void statsUpdateFrameBytes(uint32_t Bytes) { |
| if (!ALLOW_DUMP || !getFlags().DumpStats) |
| return; |
| ICE_TLS_GET_FIELD(TLS)->StatsFunction.updateFrameBytes(Bytes); |
| - getStatsCumulative()->updateFrameBytes(Bytes); |
| + ICE_TLS_GET_FIELD(TLS)->StatsCumulative.updateFrameBytes(Bytes); |
| } |
| void statsUpdateSpills() { |
| if (!ALLOW_DUMP || !getFlags().DumpStats) |
| return; |
| ICE_TLS_GET_FIELD(TLS)->StatsFunction.updateSpills(); |
| - getStatsCumulative()->updateSpills(); |
| + ICE_TLS_GET_FIELD(TLS)->StatsCumulative.updateSpills(); |
| } |
| void statsUpdateFills() { |
| if (!ALLOW_DUMP || !getFlags().DumpStats) |
| return; |
| ICE_TLS_GET_FIELD(TLS)->StatsFunction.updateFills(); |
| - getStatsCumulative()->updateFills(); |
| + ICE_TLS_GET_FIELD(TLS)->StatsCumulative.updateFills(); |
|
JF
2015/01/31 05:08:24
Can you get the field only once per function inste
Jim Stichnoth
2015/01/31 05:36:59
Nice, done.
|
| } |
| // These are predefined TimerStackIdT values. |
| @@ -296,6 +304,13 @@ public: |
| for (ThreadContext *TLS : AllThreadContexts) |
| Timers->mergeFrom(TLS->Timers); |
| } |
| + if (ALLOW_DUMP) { |
| + // Do a separate loop over AllThreadContexts to avoid holding |
| + // two locks at once. |
| + auto Stats = getStatsCumulative(); |
| + for (ThreadContext *TLS : AllThreadContexts) |
| + Stats->add(TLS->StatsCumulative); |
| + } |
| } |
| // Translation thread startup routine. |