summaryrefslogtreecommitdiff
path: root/libraries/base/Unsafe/Coerce.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/base/Unsafe/Coerce.hs')
-rw-r--r--libraries/base/Unsafe/Coerce.hs32
1 files changed, 9 insertions, 23 deletions
diff --git a/libraries/base/Unsafe/Coerce.hs b/libraries/base/Unsafe/Coerce.hs
index 07d1f2da9f..5ebc9c637e 100644
--- a/libraries/base/Unsafe/Coerce.hs
+++ b/libraries/base/Unsafe/Coerce.hs
@@ -90,10 +90,10 @@ several ways
(U1) unsafeEqualityProof is /never/ inlined.
-(U2) In CoreToStg.coreToStg, we transform
- case unsafeEqualityProof of UnsafeRefl -> blah
+(U2) In CoreToStg.Prep, we transform
+ case unsafeEqualityProof of UnsafeRefl g -> blah
==>
- blah
+ blah[unsafe-co/g]
This eliminates the overhead of evaluating the unsafe
equality proof.
@@ -127,18 +127,15 @@ several ways
and produce a thunk even after discarding the unsafeEqualityProof.
So instead we float out the case to give
case unsafeEqualityProof ... of { UnsafeRefl ->
- let a = K e
+ let a = e
x = K a
- in ...
- Flaoting the case is OK here, even though it broardens the
+ in ... }
+ Floating the case is OK here, even though it broadens the
scope, because we are done with simplification.
-(U4) GHC.CoreToStg.Prep.cpeExprIsTrivial anticipates the
- upcoming discard of unsafeEqualityProof.
-
-(U4a) Ditto GHC.Core.Unfold.inlineBoringOk we want to treat
- the RHS of unsafeCoerce as very small; see
- Note [Inline unsafeCoerce] in that module.
+(U4) Ditto GHC.Core.Unfold.inlineBoringOk we want to treat
+ the RHS of unsafeCoerce as very small; see
+ Note [Inline unsafeCoerce] in that module.
(U5) The definition of unsafeEqualityProof in Unsafe.Coerce
looks very strange:
@@ -212,17 +209,6 @@ There are yet more wrinkles
the kind-/homogeneous/ unsafeEqualityProof twice.
See Note [Wiring in unsafeCoerce#] in Desugar.
-
-(U11) We must also be careful to discard unsafeEqualityProof in the
- bytecode generator; see ByteCodeGen.bcView. Here we don't really
- care about fast execution, but (annoyingly) we /do/ care about the
- GHCi debugger, and GHCi itself uses unsafeCoerce.
-
- Moreover, in GHC.Tc.Module.tcGhciStmts we use unsafeCoerce#, rather
- than the more kosher unsafeCoerce, because (with -O0) the latter
- may not be inlined.
-
- Sigh
-}
-- | This type is treated magically within GHC. Any pattern match of the