From 6c7fff0b6f9514d6572cbe6bbfa4aafc259caebe Mon Sep 17 00:00:00 2001 From: Simon Peyton Jones Date: Thu, 15 Apr 2021 15:20:26 +0100 Subject: Eliminate unsafeEqualityProof in CorePrep The main idea here is to avoid treating * case e of {} * case unsafeEqualityProof of UnsafeRefl co -> blah specially in CoreToStg. Instead, nail them in CorePrep, by converting case e of {} ==> e |> unsafe-co case unsafeEqualityProof of UnsafeRefl cv -> blah ==> blah[unsafe-co/cv] in GHC.Core.Prep. Now expressions that we want to treat as trivial really are trivial. We can get rid of cpExprIsTrivial. And we fix #19700. A downside is that, at least under unsafeEqualityProof, we substitute in types and coercions, which is more work. But a big advantage is that it's all very simple and principled: CorePrep really gets rid of the unsafeCoerce stuff, as it does empty case, runRW#, lazyId etc. I've updated the overview in GHC.Core.Prep, and added Note [Unsafe coercions] in GHC.Core.Prep Note [Implementing unsafeCoerce] in base:Unsafe.Coerce We get 3% fewer bytes allocated when compiling perf/compiler/T5631, which uses a lot of unsafeCoerces. (It's a happy-generated parser.) Metric Decrease: T5631 --- compiler/GHC/CoreToIface.hs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'compiler/GHC/CoreToIface.hs') diff --git a/compiler/GHC/CoreToIface.hs b/compiler/GHC/CoreToIface.hs index 307dfd4893..3add18ff02 100644 --- a/compiler/GHC/CoreToIface.hs +++ b/compiler/GHC/CoreToIface.hs @@ -313,6 +313,8 @@ toIfaceCoercionX fr co go_prov (PhantomProv co) = IfacePhantomProv (go co) go_prov (ProofIrrelProv co) = IfaceProofIrrelProv (go co) go_prov (PluginProv str) = IfacePluginProv str + go_prov CorePrepProv = pprPanic "toIfaceCoercionX" empty + -- CorePrepProv only happens after the iface file is generated toIfaceTcArgs :: TyCon -> [Type] -> IfaceAppArgs toIfaceTcArgs = toIfaceTcArgsX emptyVarSet -- cgit v1.2.1