[Git][ghc/ghc][wip/romes/isNullaryRepDataCon] Precompute static closures for DataCons with zero-width args

Rodrigo Mesquita (@alt-romes) gitlab at gitlab.haskell.org
Mon Apr 17 11:18:29 UTC 2023



Rodrigo Mesquita pushed to branch wip/romes/isNullaryRepDataCon at Glasgow Haskell Compiler / GHC


Commits:
7db22908 by Rodrigo Mesquita at 2023-04-17T12:04:42+01:00
Precompute static closures for DataCons with zero-width args

Relax the predicate over nullary datacons that determines whether we can
return a precomputed static closure for them, such that we give
precomputed static closures to datacons that only take zero-width
arguments.

Previously, we would only allow datacons that were nullary with regard
to their Core representation, which prevented datacons with only
zero-width arguments from using a precomputed static closure.

- - - - -


2 changed files:

- compiler/GHC/StgToCmm/Closure.hs
- compiler/GHC/StgToCmm/DataCon.hs


Changes:

=====================================
compiler/GHC/StgToCmm/Closure.hs
=====================================
@@ -22,7 +22,7 @@ module GHC.StgToCmm.Closure (
         argPrimRep,
 
         NonVoid(..), fromNonVoid, nonVoidIds, nonVoidStgArgs,
-        assertNonVoidIds, assertNonVoidStgArgs,
+        assertNonVoidIds, assertNonVoidStgArgs, hasNoNonZeroWidthArgs,
 
         -- * LambdaFormInfo
         LambdaFormInfo,         -- Abstract
@@ -170,6 +170,12 @@ assertNonVoidStgArgs :: [StgArg] -> [NonVoid StgArg]
 assertNonVoidStgArgs args = assert (not (any (isZeroBitTy . stgArgType) args)) $
                             coerce args
 
+-- | Returns whether there are any arguments with a non-zero-width runtime
+-- representation.
+--
+-- Returns True if the datacon has no or /just/ zero-width arguments.
+hasNoNonZeroWidthArgs :: DataCon -> Bool
+hasNoNonZeroWidthArgs = all (isZeroBitTy . scaledThing) . dataConRepArgTys
 
 -----------------------------------------------------------------------------
 --                Representations
@@ -281,7 +287,6 @@ mkLFImported id =
         -> mkLFArgument id -- Not sure of exact arity
   where
     arity = idFunRepArity id
-    hasNoNonZeroWidthArgs = all (isZeroBitTy . scaledThing) . dataConRepArgTys
 
 {-
 Note [The LFInfo of Imported Ids]


=====================================
compiler/GHC/StgToCmm/DataCon.hs
=====================================
@@ -326,9 +326,9 @@ because they don't support cross package data references well.
 -- See Note [Precomputed static closures]
 precomputedStaticConInfo_maybe :: StgToCmmConfig -> Id -> DataCon -> [NonVoid StgArg] -> Maybe CgIdInfo
 precomputedStaticConInfo_maybe cfg binder con []
--- Nullary constructors
-  | isNullaryRepDataCon con
-  = Just $ litIdInfo (stgToCmmPlatform cfg) binder (mkConLFInfo con)
+  -- Nullary constructors (list of nonvoid args is null)
+  = assert (hasNoNonZeroWidthArgs con) $
+    Just $ litIdInfo (stgToCmmPlatform cfg) binder (mkConLFInfo con)
                 (CmmLabel (mkClosureLabel (dataConName con) NoCafRefs))
 precomputedStaticConInfo_maybe cfg binder con [arg]
   -- Int/Char values with existing closures in the RTS



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/7db2290840030d0b8d23e10a1b774643e001dfdf

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/7db2290840030d0b8d23e10a1b774643e001dfdf
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20230417/8842ad2d/attachment-0001.html>


More information about the ghc-commits mailing list