
I submitted !1667 which fixes the coercion checks outside of CorePrep. The coercion checks are now done the same way as in CorePrep (as explained in Note [Bad unsafe coercion]) and they take the platform word size into account. This unblocks !1381. Ömer On 5.09.2019 01:35, Simon Peyton Jones wrote:
You successfully persuaded me, in #17026, that getting rid of Int and IntRep in a platform-dependent way is very awkward to implement.
My proposal, made in #17026 is:
* Keep Int# distinct from Int32#, Int64# * Keep IntRep distinct from Int32Rep, Int64Rep. * Have primops to convert between Ints of various widths. (Need to lay out exactly what these are.)
* And make the core-to-STG (only) implement some of these primops as no-ops, depending on the architecture; e.g. Int# -> Int64# is a no-op on a 64 bit machine.
So STG would "know" that Int# and Int64# are the same. I say STG because the unarise pass needs to know the width of each type for implementing sum types, I think.
* So yes, some tests in the STG and Cmm part would need platform information.
Does that make sense? If so that would unblock !1381.
Simon
| -----Original Message----- | From: Ömer Sinan Ağacan
| Sent: 04 September 2019 14:29 | To: Simon Peyton Jones ; Ben Gamari | Cc: ghc-devs@haskell.org; Simon Marlow | Subject: Re: IntRep etc | | Hi all, | | > !1381/#16893: inline unsafeCoerce# in CorePrep | | The problem with !1381 is that it reveals a coercion accepted by CoreLint | but rejected by an assertion later in the compilation. The coercion casts | an Int# to Int64#, which is fine on a 64-bit system. One way to fix this | is by fixing #17026, but as explained in the issue it's too much work and | it'll either require huge amount of work (if we implement some kind of | Type/TyCon caching) or make everything slower (if we make top-level | intPrimTy/intPrimTyCon which are currently constants, functions). | | > #17041: coercion safety in STG Lint | | This basically asks for a type checker that works on PrimReps instead of | Types. | I was too busy with #9718/!1304 and #17088 so couldn't make progress here. | Perhaps I can work on this at MuniHac. | | > !1552: tidy up linting on unsafe coercions | | I'll address your comments and test this more. My main concern (and the | reason why I added "DO NOT MERGE") was that I wasn't 100% sure that this | change is sound (though I don't remember what I was concerned about | specifically). I'll try to test this more on my desktop (where I can more | efficiently make release builds and test) when I'm back home. | | > #16964: definition of Int# | | The part related to GHC internals is moved to #17026. Regarding definition | of Int#, I'm not sure what to do about this, | | > #17026: definition of IntRep | | Simon argues that if we keep Int and Int# distinct types (rather than | synonyms to Int32/Int64 and Int32#/Int64# depending on platform word size, | this is discussed in #16964) then we should keep RuntimeReps for them | distinct too. | I think this is mostly fine but a problem with this that blocked !1381 is | IntRep and Int64Rep are not equal (according to the Eq instance) on a 64- | bit system so a simple code that checks whether two types are represented | the same fails. | | If we keep IntRep/WordRep then I think we should remove the Eq instance of | PrimRep and and provide a `primRepEq :: PlatformWordSize -> PrimRep -> | PrimRep | -> Eq` for checking whether types are represented the same on the target | platform (or maybe name it `primRepCoercible`). | | | So in summary; I think I'll make progress in this order: | | - Read the changes in !1552, test it more. | - If merged then !1381 will be unblocked, merge it. | - Remove Eq instance of PrimRep, implement primRepEq (or primRepCoercible) | that | takes target platform size as argument. Use this in coercion checks. | - This also unblocks !1381, merge it | - Implement type checker in StgLint that works on PrimReps (instead of on | actual types). | | I'm not sure about how to proceed in #16964. I'm inclined to just document | the status quo more accurately, but apparently there's also a MR that's | supposed to improve/fix it (!1102), though I'm having trouble seeing how | it is even related. | | Ömer | | On 3.09.2019 00:45, Simon Peyton Jones wrote: | > Omer, Ben | > | > There's a little cluster of tickets that it'd be really good to nail. | > | > * !1381/#16893: inline unsafeCoerce# in CorePrep | > * #17041: coercion safety in STG Lint | > * !1552: tidy up linting on unsafe coercions | > * #16964: definition of Int# | > * #17026: definition of IntRep | > | > They are all somehow tied up together. Can we kill them off together, | > soon? I have left comments... | > | > Simon | >