StgLint worth maintaining?

Ömer Sinan Ağacan omeragacan at gmail.com
Sat Feb 10 15:09:05 UTC 2018


Created #14787 as tracking ticket. Patch is at D4404.

Ömer

2018-02-09 12:22 GMT+03:00 Simon Peyton Jones <simonpj at microsoft.com>:
> Good summary!  I suggest that you open a ticket with this email as the Description.  Then we can point to it later.
>
> I agree that there is little point in flogging a dead horse.  But there are /some/ invariants, so I vote for
> |  2. Rewrite it to only check these two and nothing else, enable it in
> |     validate (and in other build flavours that enable CoreLint).
> |
>
> Simon
>
> |  -----Original Message-----
> |  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of Ömer
> |  Sinan Agacan
> |  Sent: 09 February 2018 08:42
> |  To: ghc-devs <ghc-devs at haskell.org>
> |  Subject: StgLint worth maintaining?
> |
> |  Hi,
> |
> |  I've been looking into some StgLint-related tickets:
> |
> |  - #13994: Found a StgLint problem and fixed, there's another problem
> |            waiting to be fixed. Both related with the fact that after
> |            unarisation we lose even more typing information and type
> |            checks needs to be relaxed.
> |
> |  - #14116: StgLint failed to look through newtypes, and because
> |  coercions
> |            are removed at that point it failed to type check. Solution
> |            was to relax type checks.
> |
> |  - #5345:  Because `unsafeCoerce# is operationally no-op, and we don't
> |            have coercions in STG, StgLint can't type check at all. The
> |            commit message notes:
> |
> |            > Fundamentally STG Lint is impossible, because
> |  unsafeCoerce#
> |            > can randomise all the types.
> |
> |            > This patch does a bit of fiddle faddling in StgLint which
> |            > makes it a bit better, but it's a losing battle.
> |
> |  - #14117: Related with StgLint not keeping up with recent changes
> |  (join
> |            points), because it's not enabled by default in
> |            tests/validate.
> |
> |  - #14118: Related with the fact that pre- and post-unarise we have
> |            different invariants in STG. Solution was to add a "unarise"
> |            parameter and do different checks based on that.
> |
> |  - #14120: Again type checking errors. Commit for #14116 also fixes
> |  this.
> |            The commits compares `typePrimRep`s of types instead of
> |            comparing actual types (even this is not enough, see
> |  #13994).
> |
> |  All this of course took time to debug.
> |
> |  In addition, the new `StgCSE` pass makes transformations that trigger
> |  case alternative checks (and probably some other checks) because
> |  scrutinee and result won't have same types after the transformation
> |  described in `Note [Case 2: CSEing case binders]`.
> |
> |  There's also this comment in StgLint.hs
> |
> |      WARNING:
> |      ~~~~~~~~
> |
> |      This module has suffered bit-rot; it is likely to yield lint
> |  errors
> |      for Stg code that is currently perfectly acceptable for code
> |      generation.  Solution: don't use it!  (KSW 2000-05).
> |
> |  It seems like it hasn't been used since 2000.
> |
> |  All this suggests that
> |
> |  - Checks related to types are impossible in StgLint. (see e.g. commit
> |    messages in #5345, #1420, transformations done by unariser and
> |    StgCSE)
> |
> |  - It's not enabled since 2000, which I think means that it's not
> |    needed.
> |
> |  This makes me question whether it's worth maintaining. Maybe we should
> |  just remove it.
> |
> |  If we still want to keep we should decide on what it's supposed to do.
> |  Only invariants I can think of are:
> |
> |  - After unarise there should be no unboxed tuple and sum binders.
> |
> |    unarise is a simple pass and does same thing to all binders, there
> |  are
> |    no tricky cases so I'm not sure if we need to check this.
> |
> |  - Variables should be defined before use. I again don't know if this
> |    should be checked, could this be useful for StgCSE?
> |
> |  So I think we should do one of these:
> |
> |  1. Remove StgLint.
> |
> |  2. Rewrite it to only check these two and nothing else, enable it in
> |     validate (and in other build flavours that enable CoreLint).
> |
> |  What do you think? If you think we should keep StgLint, can you think
> |  of any other checks? If we could reach a consensus I'm hoping to
> |  update StgLint (or remove it).
> |
> |  Thanks,
> |
> |  Ömer
> |  _______________________________________________
> |  ghc-devs mailing list
> |  ghc-devs at haskell.org
> |  https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fmail.h
> |  askell.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fghc-
> |  devs&data=04%7C01%7Csimonpj%40microsoft.com%7C9d9affa423c84c84a25908d5
> |  6f992d87%7Cee3303d7fb734b0c8589bcd847f1c277%7C1%7C0%7C6365376260479856
> |  64%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI
> |  6Ik1haWwifQ%3D%3D%7C-
> |  1&sdata=GZ4xMoVQGyQFZxhlODBqMnWoiZrV82pqOn2ZrbvDo4U%3D&reserved=0


More information about the ghc-devs mailing list