From f002250abac21ee4e9c9e4d7bc05db8aa885a65d Mon Sep 17 00:00:00 2001
From: Andreas Klebinger <klebinger.andreas@gmx.at>
Date: Thu, 4 Jul 2019 12:50:00 +0200
Subject: [PATCH] Dont gather ticks when only striping them in STG.

Adds stripStgTicksTopE which only returns the stripped expression.
So far we also allocated a list for the stripped ticks which was
never used.

Allocation difference is as expected very small but present.
About 0.02% difference when compiling with -O.
---
 compiler/codeGen/StgCmmBind.hs |  2 +-
 compiler/stgSyn/CoreToStg.hs   |  4 ++--
 compiler/stgSyn/StgSyn.hs      | 10 ++++++++--
 3 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/compiler/codeGen/StgCmmBind.hs b/compiler/codeGen/StgCmmBind.hs
index 68a79878d3b3..7189800f6ee8 100644
--- a/compiler/codeGen/StgCmmBind.hs
+++ b/compiler/codeGen/StgCmmBind.hs
@@ -265,7 +265,7 @@ mkRhsClosure    dflags bndr _cc
                 upd_flag                -- Updatable thunk
                 []                      -- A thunk
                 expr
-  | let strip = snd . stripStgTicksTop (not . tickishIsCode)
+  | let strip = stripStgTicksTopE (not . tickishIsCode)
   , StgCase (StgApp scrutinee [{-no args-}])
          _   -- ignore bndr
          (AlgAlt _)
diff --git a/compiler/stgSyn/CoreToStg.hs b/compiler/stgSyn/CoreToStg.hs
index 6c59ebb08172..dae1e351eb17 100644
--- a/compiler/stgSyn/CoreToStg.hs
+++ b/compiler/stgSyn/CoreToStg.hs
@@ -716,7 +716,7 @@ mkTopStgRhs dflags this_mod ccs bndr rhs
     , ccs )
 
   where
-    (_, unticked_rhs) = stripStgTicksTop (not . tickishIsCode) rhs
+    unticked_rhs = stripStgTicksTopE (not . tickishIsCode) rhs
 
     upd_flag | isUsedOnce (idDemandInfo bndr) = SingleEntry
              | otherwise                      = Updatable
@@ -758,7 +758,7 @@ mkStgRhs bndr rhs
                   currentCCS
                   upd_flag [] rhs
   where
-    (_, unticked_rhs) = stripStgTicksTop (not . tickishIsCode) rhs
+    unticked_rhs = stripStgTicksTopE (not . tickishIsCode) rhs
 
     upd_flag | isUsedOnce (idDemandInfo bndr) = SingleEntry
              | otherwise                      = Updatable
diff --git a/compiler/stgSyn/StgSyn.hs b/compiler/stgSyn/StgSyn.hs
index 2372e3ed27f4..e6a12053990b 100644
--- a/compiler/stgSyn/StgSyn.hs
+++ b/compiler/stgSyn/StgSyn.hs
@@ -50,7 +50,7 @@ module StgSyn (
         topStgBindHasCafRefs, stgArgHasCafRefs, stgRhsArity,
         isDllConApp,
         stgArgType,
-        stripStgTicksTop,
+        stripStgTicksTop, stripStgTicksTopE,
         stgCaseBndrInScope,
 
         pprStgBinding, pprGenStgTopBindings, pprStgTopBindings
@@ -163,12 +163,18 @@ stgArgType (StgVarArg v)   = idType v
 stgArgType (StgLitArg lit) = literalType lit
 
 
--- | Strip ticks of a given type from an STG expression
+-- | Strip ticks of a given type from an STG expression.
 stripStgTicksTop :: (Tickish Id -> Bool) -> GenStgExpr p -> ([Tickish Id], GenStgExpr p)
 stripStgTicksTop p = go []
    where go ts (StgTick t e) | p t = go (t:ts) e
          go ts other               = (reverse ts, other)
 
+-- | Strip ticks of a given type from an STG expression returning only the expression.
+stripStgTicksTopE :: (Tickish Id -> Bool) -> GenStgExpr p -> GenStgExpr p
+stripStgTicksTopE p = go
+   where go (StgTick t e) | p t = go e
+         go other               = other
+
 -- | Given an alt type and whether the program is unarised, return whether the
 -- case binder is in scope.
 --
-- 
GitLab