[commit: ghc] master: make iToBase62's inner loop stricter in one of its arguments (ed78951)

Simon Peyton Jones simonpj at microsoft.com
Mon Sep 3 12:54:42 UTC 2018


Alp,

Is this related to #15570.  If so, it'd be good to make that connection.

S

|  -----Original Message-----
|  From: ghc-commits <ghc-commits-bounces at haskell.org> On Behalf Of
|  git at git.haskell.org
|  Sent: 02 September 2018 22:16
|  To: ghc-commits at haskell.org
|  Subject: [commit: ghc] master: make iToBase62's inner loop stricter in
|  one of its arguments (ed78951)
|  
|  Repository : ssh://git@git.haskell.org/ghc
|  
|  On branch  : master
|  Link       :
|  https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fghc.haske
|  ll.org%2Ftrac%2Fghc%2Fchangeset%2Fed789516e201e4fad771e5588da47a62e53b42b
|  8%2Fghc&data=02%7C01%7Csimonpj%40microsoft.com%7Cea714d654b04488aada9
|  08d6111955e2%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636715197856324
|  232&sdata=3Oo7y3FCIzEZVAWc%2FPl6ZXwji2QM2CWWAI3UfHqxDn0%3D&reserv
|  ed=0
|  
|  >---------------------------------------------------------------
|  
|  commit ed789516e201e4fad771e5588da47a62e53b42b8
|  Author: Alp Mestanogullari <alp at well-typed.com>
|  Date:   Sun Sep 2 22:06:55 2018 +0200
|  
|      make iToBase62's inner loop stricter in one of its arguments
|  
|      Summary:
|      hadrian's support for dynamic ways is currently broken (see
|  hadrian#641 [1]).
|      The stage 1 GHCs that hadrian produces end up producing bad code for
|      the `iToBase62` function after a few optimisation passes.
|  
|      In the case where `quotRem` returns (overflowError, 0),
|      GHC isn't careful enough to realise q is _|_ and happily inlines,
|      distributes and floats code around until we end up trying to access
|      index `minBound :: Int` of an array of 62 chars, as a result of
|  inlining
|      the definition of `quotRem` for Ints, in particular the minBound
|  branch [2].
|  
|      I will separately look into reproducing the bad transformation on a
|  small
|      self-contained example and filling a ticket.
|  
|      [1]:
|  https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.c
|  om%2Fsnowleopard%2Fhadrian%2Fissues%2F641&data=02%7C01%7Csimonpj%40mi
|  crosoft.com%7Cea714d654b04488aada908d6111955e2%7C72f988bf86f141af91ab2d7c
|  d011db47%7C1%7C0%7C636715197856324232&sdata=a7dM0YbraOY69xKhJcwVuQqBn
|  3n3nTdVuMFNjie6iHA%3D&reserved=0
|      [2]:
|  https://git.haskell.org/ghc.git/blob/HEAD:/libraries/base/GHC/Real.hs#l36
|  6
|  
|      Test Plan: fixes hadrian#641
|  
|      Reviewers: bgamari, tdammers
|  
|      Reviewed By: tdammers
|  
|      Subscribers: tdammers, rwbarton, carter
|  
|      Differential Revision: https://phabricator.haskell.org/D5106
|  
|  
|  >---------------------------------------------------------------
|  
|  ed789516e201e4fad771e5588da47a62e53b42b8
|   compiler/basicTypes/Unique.hs | 2 +-
|   1 file changed, 1 insertion(+), 1 deletion(-)
|  
|  diff --git a/compiler/basicTypes/Unique.hs
|  b/compiler/basicTypes/Unique.hs index 4a709d2..b5c0fce 100644
|  --- a/compiler/basicTypes/Unique.hs
|  +++ b/compiler/basicTypes/Unique.hs
|  @@ -325,7 +325,7 @@ iToBase62 n_
|       go n cs | n < 62
|               = let !c = chooseChar62 n in c : cs
|               | otherwise
|  -            = go q (c : cs) where (q, r) = quotRem n 62
|  +            = go q (c : cs) where (!q, r) = quotRem n 62
|                                     !c = chooseChar62 r
|  
|       chooseChar62 :: Int -> Char
|  
|  _______________________________________________
|  ghc-commits mailing list
|  ghc-commits at haskell.org
|  https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail.hask
|  ell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-
|  commits&data=02%7C01%7Csimonpj%40microsoft.com%7Cea714d654b04488aada9
|  08d6111955e2%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636715197856324
|  232&sdata=5oKSdyvdcyJlPR%2FtNUNuptlsFuv9jJA%2FVmc7AOid5mc%3D&rese
|  rved=0


More information about the ghc-devs mailing list