IntRep etc

Ömer Sinan Ağacan omer at well-typed.com
Sat Sep 7 10:04:47 UTC 2019


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 <omer at well-typed.com>
> | Sent: 04 September 2019 14:29
> | To: Simon Peyton Jones <simonpj at microsoft.com>; Ben Gamari <ben at well-
> | typed.com>
> | Cc: ghc-devs at haskell.org; Simon Marlow <marlowsd at gmail.com>
> | 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
> | >
> 


More information about the ghc-devs mailing list