[GHC] #14283: Remove the special case for tagToEnum# in the code generator?
GHC
ghc-devs at haskell.org
Wed Sep 27 05:37:51 UTC 2017
#14283: Remove the special case for tagToEnum# in the code generator?
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner: (none)
Type: task | Status: new
Priority: normal | Milestone: 8.4.1
Component: Compiler | Version: 8.2.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Description changed by dfeuer:
Old description:
> The only remaining primop (aside from `unsafeCoerce#` and `seq`) that
> produces an enumeration type is `tagToEnum#`. There is some magic in the
> code generator to make garbage collection relating to this work as it has
> historically. We want to get rid of the special case. Simply removing it
> altogether actually does seem to work, but the code we generate likely
> isn't quite the same. The challenge here is that (despite what I thought
> earlier) we definitely ''can'' end up in code generation, under certain
> circumstances, with
>
> {{{#!hs
> case tagToEnum# @t x of
> ...
> }}}
>
> How does this happen? After all, in `caseRules` we carefully remove every
> case on `tagToEnum#` and `dataToTag#` applications! The trouble comes
> when CorePrep puts everything in A-normal form. Strict function
> applications are transformed into `case` forms, so
>
> {{{#!hs
> f (tagToEnum# x)
> }}}
>
> will become
>
> {{{#!hs
> case tagToEnum# x of y
> DEFAULT -> f y
> }}}
>
> Suddenly we have that ugly case! Hmph.
New description:
The only remaining primop (aside from `unsafeCoerce#` and `seq`) that
produces an enumeration type is `tagToEnum#`. There is some magic in the
code generator to make garbage collection relating to this work as it has
historically. We want to get rid of the special case. Simply removing it
altogether actually does seem to work (in that CI doesn't complain, see
Phab:D3980, although I don't yet know why), but the code we generate
likely isn't quite the same. The challenge here is that (despite what I
thought earlier) we definitely ''can'' end up in code generation, under
certain circumstances, with
{{{#!hs
case tagToEnum# @t x of
...
}}}
How does this happen? After all, in `caseRules` we carefully remove every
case on `tagToEnum#` and `dataToTag#` applications! The trouble comes when
CorePrep puts everything in A-normal form. Strict function applications
are transformed into `case` forms, so
{{{#!hs
f (tagToEnum# x)
}}}
will become
{{{#!hs
case tagToEnum# x of y
DEFAULT -> f y
}}}
Suddenly we have that ugly case! Hmph.
--
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14283#comment:1>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list