summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Graf <sebastian.graf@kit.edu>2018-11-30 17:18:45 +0100
committerSebastian Graf <sebastian.graf@kit.edu>2018-11-30 17:18:46 +0100
commitf10df65fa2c9a5ec2f4c09b97e02e87c377beac3 (patch)
tree19b624d6f41ee0554c693ce4fe47a494ed38ac24
parent47875bd4d79ca633b589e63e320aa5a5c631d096 (diff)
downloadhaskell-f10df65fa2c9a5ec2f4c09b97e02e87c377beac3.tar.gz
Deduplicate decision to count thunks in `-ticky`
Summary: Previously, the logic that checks whether a thunk has a counter or not was duplicated in multiple functions. This led to thunk enters being accounted to their enclosing functions in `StgCmmTicky.tickyEnterThunk`, because the outer call to `withNewTickyCounterThunk` didn't set the counter label for the thunk. And rightly so! `tickyEnterThunk` should only account thunk enters to a counter if `-ticky-dyn-thunk` is on. This patch extracts the logic that was already present in its most general form in `withNewTickyCounterThunk` into its own functions and lets all other call sites checking for `-ticky-dyn-thunk` call this new function named `thunkHasCounter` instead. Reviewers: bgamari, simonmar Reviewed By: simonmar Subscribers: rwbarton, carter Differential Revision: https://phabricator.haskell.org/D5392
-rw-r--r--compiler/codeGen/StgCmmTicky.hs22
1 files changed, 14 insertions, 8 deletions
diff --git a/compiler/codeGen/StgCmmTicky.hs b/compiler/codeGen/StgCmmTicky.hs
index 8f3074856a..e673d216b2 100644
--- a/compiler/codeGen/StgCmmTicky.hs
+++ b/compiler/codeGen/StgCmmTicky.hs
@@ -136,7 +136,7 @@ import TyCon
import Data.Maybe
import qualified Data.Char
-import Control.Monad ( unless, when )
+import Control.Monad ( when )
-----------------------------------------------------------------------------
--
@@ -161,6 +161,11 @@ withNewTickyCounterLNE nm args code = do
b <- tickyLNEIsOn
if not b then code else withNewTickyCounter TickyLNE nm args code
+thunkHasCounter :: Bool -> FCode Bool
+thunkHasCounter isStatic = do
+ b <- tickyDynThunkIsOn
+ pure (not isStatic && b)
+
withNewTickyCounterThunk
:: Bool -- ^ static
-> Bool -- ^ updateable
@@ -168,8 +173,8 @@ withNewTickyCounterThunk
-> FCode a
-> FCode a
withNewTickyCounterThunk isStatic isUpdatable name code = do
- b <- tickyDynThunkIsOn
- if isStatic || not b -- ignore static thunks
+ has_ctr <- thunkHasCounter isStatic
+ if not has_ctr
then code
else withNewTickyCounter (TickyThunk isUpdatable False) name [] code
@@ -179,8 +184,8 @@ withNewTickyCounterStdThunk
-> FCode a
-> FCode a
withNewTickyCounterStdThunk isUpdatable name code = do
- b <- tickyDynThunkIsOn
- if not b
+ has_ctr <- thunkHasCounter False
+ if not has_ctr
then code
else withNewTickyCounter (TickyThunk isUpdatable True) name [] code
@@ -189,8 +194,8 @@ withNewTickyCounterCon
-> FCode a
-> FCode a
withNewTickyCounterCon name code = do
- b <- tickyDynThunkIsOn
- if not b
+ has_ctr <- thunkHasCounter False
+ if not has_ctr
then code
else withNewTickyCounter TickyCon name [] code
@@ -277,7 +282,8 @@ tickyEnterThunk :: ClosureInfo -> FCode ()
tickyEnterThunk cl_info
= ifTicky $ do
{ bumpTickyCounter ctr
- ; unless static $ do
+ ; has_ctr <- thunkHasCounter static
+ ; when has_ctr $ do
ticky_ctr_lbl <- getTickyCtrLabel
registerTickyCtrAtEntryDyn ticky_ctr_lbl
bumpTickyEntryCount ticky_ctr_lbl }