unsafeCorece is intended to be a no-op at run-time; that is, it has no work to do. Converting a pointer to one type of thing to a pointer to another type of thing is an example. Converting a 32-bit Int to a 64 bit int is *not* an example. Converting a 32-bit float to a 32-bit int (which you are trying here) may or may not be an example, I guess, depending on the architecture.
Rather than trying to keep casts, I'd suggest adding a new primop for non-trivial primitive-type conversions. There might be a lot of these I suppose; we could consider making them 'polymorphic', but retaining the type in STG land. Simon | -----Original Message----- | From: [EMAIL PROTECTED] [mailto:glasgow-haskell-bugs- | [EMAIL PROTECTED] On Behalf Of Simon Marlow | Sent: 11 March 2005 10:20 | To: Donald Bruce Stewart; glasgow-haskell-bugs@haskell.org | Subject: RE: Illtyped generated code with unsafeCoerce#, F# and -O | | On 11 March 2005 01:45, Donald Bruce Stewart wrote: | | > Hey guys, | > | > The following (evil, yes) program compiles and works under ghc -Onot | > using -fasm or -fvia-C, but fails to generated correct code under all | > GHCs back to ghc-5.04.2 if I turn on -O. (It also works under ghci). | > | > When working it runs and produces the following (correct) result: | > | > paprika$ ./a.out | > 7777.0 | > (69,243,8,0) | > 7777.0 | > | > However, if I turn on -O it fails to generate acceptable asm or C. | > | > Am I right in thinking that all uses of unsafeCoerce# should never | > cause type-incorrect C or asm code to be generated (no matter what | > evil happens at runtime)? | > | > Now, -dcore-lint is fine, but our shiny new 6.4 -dcmm-lint spots the | > error :) | > | > Cmm lint error: | > in proc s2D4_ret | > in basic block c2F7 | > in MachOp application: | > 7777.0 :: F32 & 255 | | I *think* the answer is that this kind of type casting just isn't | supported by the code generator at the moment. The Core is fine because | it includes the explicit type coercion, but this has been lost in the | STG code, and the code generator assumes that it is generating code for | type-correct STG code (although some coercions are allowed, ie. | coercions between values with the same MachRep). | | I can see at least two ways we might try to fix this: | | - try to detect type incompabilities in the STG->cmm code generator | and insert type casting operations. | | - possibly retain the type coercion from Core as an application of | a type-casting operation in STG, so the backend can generate | appropriate code for it. | | The latter sounds more promising. | | Cheers, | Simon | _______________________________________________ | Glasgow-haskell-bugs mailing list | Glasgow-haskell-bugs@haskell.org | http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs _______________________________________________ Glasgow-haskell-bugs mailing list Glasgow-haskell-bugs@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs