[Git][ghc/ghc][wip/T18291] 2 commits: Allow unsaturated runRW# applications

Ben Gamari gitlab at gitlab.haskell.org
Tue Jun 2 21:01:23 UTC 2020



Ben Gamari pushed to branch wip/T18291 at Glasgow Haskell Compiler / GHC


Commits:
b5150383 by Ben Gamari at 2020-06-02T17:01:19-04:00
Allow unsaturated runRW# applications

Previously we had a very aggressive Core Lint check which caught
unsaturated applications of runRW#. However, there is nothing
wrong with such applications and they may naturally arise in desugared
Core. For instance, the desugared Core of Data.Array.runArray# from the
`primitive` package contains:

    case ($) (runRW# @_ @_) (\s -> ...) of ...

In this case it's almost certain that ($) will be inlined, turning the
application into a saturated application. However, even if this weren't
the case there isn't a problem: CorePrep (after deleting an unnecessary
case) can simply generate code in its usual way, resulting in a call to
the Haskell definition of runRW#.

- - - - -
18013457 by Ben Gamari at 2020-06-02T17:01:19-04:00
testsuite: Add test for #18291

- - - - -


4 changed files:

- compiler/GHC/Core/Lint.hs
- compiler/GHC/CoreToStg/Prep.hs
- + testsuite/tests/codeGen/should_compile/T18291.hs
- testsuite/tests/codeGen/should_compile/all.T


Changes:

=====================================
compiler/GHC/Core/Lint.hs
=====================================
@@ -923,10 +923,6 @@ lintCoreExpr e@(App _ _)
        ; app_ty <- lintValApp arg3 fun_ty2 arg3_ty
        ; lintCoreArgs app_ty rest }
 
-  | Var fun <- fun
-  , fun `hasKey` runRWKey
-  = failWithL (text "Invalid runRW# application")
-
   | otherwise
   = do { fun_ty <- lintCoreFun fun (length args)
        ; lintCoreArgs fun_ty args }


=====================================
compiler/GHC/CoreToStg/Prep.hs
=====================================
@@ -842,10 +842,6 @@ cpeApp top_env expr
             _          -> cpe_app env arg (CpeApp (Var realWorldPrimId) : rest) (n-1)
              -- TODO: What about casts?
 
-    cpe_app _env (Var f) args n
-        | f `hasKey` runRWKey
-        = pprPanic "cpe_app(runRW#)" (ppr args $$ ppr n)
-
     cpe_app env (Var v) args depth
       = do { v1 <- fiddleCCall v
            ; let e2 = lookupCorePrepEnv env v1
@@ -1018,9 +1014,9 @@ for runRW# applications. See Note [Linting of runRW#] for details on the latter.
 
 Moreover, it's helpful to ensure that runRW's continuation isn't floated out
 (since doing so would then require a call, whereas we would otherwise end up
-with straight-line). Consequently, GHC.Core.Opt.SetLevels.lvlApp has special
-treatment for runRW# applications, ensure the arguments are not floated if
-MFEs.
+with straight-line code). Consequently, GHC.Core.Opt.SetLevels.lvlApp has
+special treatment for runRW# applications, ensure the arguments are not floated
+as MFEs.
 
 Other considered designs
 ------------------------


=====================================
testsuite/tests/codeGen/should_compile/T18291.hs
=====================================
@@ -0,0 +1,5 @@
+{-# LANGUAGE MagicHash #-}
+module T18291 where
+
+hi :: Int
+hi = runRW# $ \_ -> 42


=====================================
testsuite/tests/codeGen/should_compile/all.T
=====================================
@@ -87,3 +87,4 @@ test('T14373d', [],
 
 test('T17648', normal, makefile_test, [])
 test('T17904', normal, compile, ['-O'])
+test('T18291', normal, compile, ['-O0'])



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/1d54ab1a3deb70ae9ed9e6770fe5c21a8c86cf45...18013457641f88ac0ce4d58d0d2d3b0adc1fde41

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/1d54ab1a3deb70ae9ed9e6770fe5c21a8c86cf45...18013457641f88ac0ce4d58d0d2d3b0adc1fde41
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/20200602/0d9b6286/attachment-0001.html>


More information about the ghc-commits mailing list