DmdAnal: Improve handling of precise exceptions
This patch does two things: Fix possible unsoundness in what was called the "IO hack" and implement part 2.1 of the "fixing precise exceptions" plan in https://gitlab.haskell.org/ghc/ghc/wikis/fixing-precise-exceptions, which, in combination with !2956, supersedes !3014 and !2525. **IO hack** The "IO hack" (which is a fallback to preserve precise exceptions semantics and thus soundness, rather than some smart thing that increases precision) is called `exprMayThrowPreciseException` now. I came up with two testcases exemplifying possible unsoundness (if twisted enough) in the old approach: - `T13380d`: Demonstrating unsoundness of the "IO hack" when resorting to manual state token threading and direct use of primops. More details below. - `T13380e`: Demonstrating unsoundness of the "IO hack" when we have Nested CPR. Not currently relevant, as we don't have Nested CPR yet. Basically, the IO hack assumed that precise exceptions can only be thrown from a case scrutinee of type `(# State# RealWorld, _ #)`. I couldn't come up with a program using the `IO` abstraction that violates this assumption. But it's easy to do so via manual state token threading and direct use of primops, see `T13380d`. Also similar code might be generated by Nested CPR in the (hopefully not too) distant future, see `T13380e`. Hence, we now have a more careful test in `forcesRealWorld` that passes `T13380{d,e}` (and will hopefully be robust to Nested CPR). **Precise exceptions** In #13380 and #17676 we saw that we didn't preserve precise exception semantics in demand analysis. We fixed that with minimal changes in !2956, but that was terribly unprincipled. That unprincipledness resulted in a loss of precision, which is tracked by these new test cases: - `T13380b`: Regression in dead code elimination, because !2956 was too syntactic about `raiseIO#` - `T13380c`: No need to apply the "IO hack" when the IO action may not throw a precise exception (and the existing IO hack doesn't detect that) Fixing both issues in !3014 turned out to be too complicated and had the potential to regress in the future. Hence we decided to only fix `T13380b` and augment the `Divergence` lattice with a new middle-layer element, `ExnOrDiv`, which means either `Diverges` (, throws an imprecise exception) or throws a *precise* exception. See the wiki page on Step 2.1 for more implementational details: https://gitlab.haskell.org/ghc/ghc/wikis/fixing-precise-exceptions#dead-code-elimination-for-raiseio-with-isdeadenddiv-introducing-exnordiv-step-21
parent
c62271a2
No related branches found
No related tags found
Pipeline #18921 passed with warnings
Stage: lint
Stage: quick-build
Stage: build
Stage: full-build
Stage: cleanup
Stage: packaging
Stage: testing
Showing
- compiler/GHC.hs 1 addition, 1 deletioncompiler/GHC.hs
- compiler/GHC/Builtin/primops.txt.pp 16 additions, 10 deletionscompiler/GHC/Builtin/primops.txt.pp
- compiler/GHC/Core/Arity.hs 3 additions, 3 deletionscompiler/GHC/Core/Arity.hs
- compiler/GHC/Core/Lint.hs 4 additions, 4 deletionscompiler/GHC/Core/Lint.hs
- compiler/GHC/Core/Opt/CallArity.hs 1 addition, 1 deletioncompiler/GHC/Core/Opt/CallArity.hs
- compiler/GHC/Core/Opt/DmdAnal.hs 74 additions, 80 deletionscompiler/GHC/Core/Opt/DmdAnal.hs
- compiler/GHC/Core/Opt/FloatIn.hs 10 additions, 5 deletionscompiler/GHC/Core/Opt/FloatIn.hs
- compiler/GHC/Core/Opt/FloatOut.hs 2 additions, 2 deletionscompiler/GHC/Core/Opt/FloatOut.hs
- compiler/GHC/Core/Opt/LiberateCase.hs 2 additions, 2 deletionscompiler/GHC/Core/Opt/LiberateCase.hs
- compiler/GHC/Core/Opt/SetLevels.hs 4 additions, 4 deletionscompiler/GHC/Core/Opt/SetLevels.hs
- compiler/GHC/Core/Opt/Simplify.hs 2 additions, 2 deletionscompiler/GHC/Core/Opt/Simplify.hs
- compiler/GHC/Core/Opt/Simplify/Utils.hs 5 additions, 8 deletionscompiler/GHC/Core/Opt/Simplify/Utils.hs
- compiler/GHC/Core/Opt/SpecConstr.hs 6 additions, 6 deletionscompiler/GHC/Core/Opt/SpecConstr.hs
- compiler/GHC/Core/Opt/WorkWrap/Utils.hs 4 additions, 1 deletioncompiler/GHC/Core/Opt/WorkWrap/Utils.hs
- compiler/GHC/Core/SimpleOpt.hs 2 additions, 2 deletionscompiler/GHC/Core/SimpleOpt.hs
- compiler/GHC/Core/Unfold.hs 3 additions, 3 deletionscompiler/GHC/Core/Unfold.hs
- compiler/GHC/Core/Utils.hs 9 additions, 10 deletionscompiler/GHC/Core/Utils.hs
- compiler/GHC/Iface/Tidy.hs 3 additions, 3 deletionscompiler/GHC/Iface/Tidy.hs
- compiler/GHC/Types/Demand.hs 324 additions, 252 deletionscompiler/GHC/Types/Demand.hs
- compiler/GHC/Types/Id.hs 7 additions, 6 deletionscompiler/GHC/Types/Id.hs
Loading
Please register or sign in to comment