diff options
author | Sebastian Graf <sebastian.graf@kit.edu> | 2022-09-09 18:08:33 +0200 |
---|---|---|
committer | Sebastian Graf <sebastian.graf@kit.edu> | 2022-09-27 15:14:54 +0200 |
commit | aeafdba5503b8d26a62dc7bc7078caef170d4154 (patch) | |
tree | 0fb69ef5ef6a206029876c0ef92b860ffce04f4d /testsuite/tests/stranal/sigs | |
parent | 615e22789a04e74d7e02239b4580b95b077c3ae0 (diff) | |
download | haskell-aeafdba5503b8d26a62dc7bc7078caef170d4154.tar.gz |
Demand: Clear distinction between Call SubDmd and eval Dmd (#21717)wip/T21717
In #21717 we saw a reportedly unsound strictness signature due to an unsound
definition of plusSubDmd on Calls. This patch contains a description and the fix
to the unsoundness as outlined in `Note [Call SubDemand vs. evaluation Demand]`.
This fix means we also get rid of the special handling of `-fpedantic-bottoms`
in eta-reduction. Thanks to less strict and actually sound strictness results,
we will no longer eta-reduce the problematic cases in the first place, even
without `-fpedantic-bottoms`.
So fixing the unsoundness also makes our eta-reduction code simpler with less
hacks to explain. But there is another, more unfortunate side-effect:
We *unfix* #21085, but fortunately we have a new fix ready:
See `Note [mkCall and plusSubDmd]`.
There's another change:
I decided to make `Note [SubDemand denotes at least one evaluation]` a lot
simpler by using `plusSubDmd` (instead of `lubPlusSubDmd`) even if both argument
demands are lazy. That leads to less precise results, but in turn rids ourselves
from the need for 4 different `OpMode`s and the complication of
`Note [Manual specialisation of lub*Dmd/plus*Dmd]`. The result is simpler code
that is in line with the paper draft on Demand Analysis.
I left the abandoned idea in `Note [Unrealised opportunity in plusDmd]` for
posterity. The fallout in terms of regressions is negligible, as the testsuite
and NoFib shows.
```
Program Allocs Instrs
--------------------------------------------------------------------------------
hidden +0.2% -0.2%
linear -0.0% -0.7%
--------------------------------------------------------------------------------
Min -0.0% -0.7%
Max +0.2% +0.0%
Geometric Mean +0.0% -0.0%
```
Fixes #21717.
Diffstat (limited to 'testsuite/tests/stranal/sigs')
-rw-r--r-- | testsuite/tests/stranal/sigs/T20746.stderr | 2 | ||||
-rw-r--r-- | testsuite/tests/stranal/sigs/T21081.stderr | 4 | ||||
-rw-r--r-- | testsuite/tests/stranal/sigs/T21119.stderr | 4 | ||||
-rw-r--r-- | testsuite/tests/stranal/sigs/T21717.hs | 12 | ||||
-rw-r--r-- | testsuite/tests/stranal/sigs/T21717.stderr | 15 | ||||
-rw-r--r-- | testsuite/tests/stranal/sigs/T5075.stderr | 4 | ||||
-rw-r--r-- | testsuite/tests/stranal/sigs/all.T | 1 |
7 files changed, 35 insertions, 7 deletions
diff --git a/testsuite/tests/stranal/sigs/T20746.stderr b/testsuite/tests/stranal/sigs/T20746.stderr index 2b54d3b8ff..65c3e5e296 100644 --- a/testsuite/tests/stranal/sigs/T20746.stderr +++ b/testsuite/tests/stranal/sigs/T20746.stderr @@ -1,6 +1,6 @@ ==================== Strictness signatures ==================== -Foo.f: <LP(A,SCS(L),A)><L> +Foo.f: <LP(A,L,A)><L> Foo.foogle: <L><L> diff --git a/testsuite/tests/stranal/sigs/T21081.stderr b/testsuite/tests/stranal/sigs/T21081.stderr index ec7e776ca8..7cf5f7cdd8 100644 --- a/testsuite/tests/stranal/sigs/T21081.stderr +++ b/testsuite/tests/stranal/sigs/T21081.stderr @@ -4,7 +4,7 @@ T21081.blah: <LCL(C1(L))><1!P(1L)> T21081.blurg: <S!P(SL)> T21081.blurg2: <S!P(SL)> T21081.call1: <MP(1L,A)> -T21081.call2: <LP(SL,A)> +T21081.call2: <LP(L,A)> T21081.call3: <LP(ML,A)> T21081.call4: <MP(1L,A)><1A> T21081.call5: <MP(1L,A)><MA> @@ -50,7 +50,7 @@ T21081.blah: <LCL(C1(L))><1!P(1L)> T21081.blurg: <1!P(SL)> T21081.blurg2: <1!P(SL)> T21081.call1: <MP(1L,A)> -T21081.call2: <LP(SL,A)> +T21081.call2: <LP(L,A)> T21081.call3: <LP(ML,A)> T21081.call4: <MP(1L,A)><1A> T21081.call5: <MP(1L,A)><MA> diff --git a/testsuite/tests/stranal/sigs/T21119.stderr b/testsuite/tests/stranal/sigs/T21119.stderr index ca60a36995..c20b876677 100644 --- a/testsuite/tests/stranal/sigs/T21119.stderr +++ b/testsuite/tests/stranal/sigs/T21119.stderr @@ -4,7 +4,7 @@ T21119.$fMyShow(,): <1!A> T21119.$fMyShowInt: <1!A> T21119.get: <1!P(1!P(L),1!P(L))><1!P(L)><1L> T21119.getIO: <1P(1L,ML)><1L><ML><L> -T21119.indexError: <1C1(S)><1!B><S!S><S>b +T21119.indexError: <1C1(L)><1!B><S!S><S>b T21119.throwIndexError: <MC1(L)><MA><L><L><L>x @@ -24,7 +24,7 @@ T21119.$fMyShow(,): <1!A> T21119.$fMyShowInt: <1!A> T21119.get: <1!P(1!P(L),1!P(L))><1!P(L)><1L> T21119.getIO: <1P(1L,ML)><1L><ML><L> -T21119.indexError: <1C1(S)><1!B><S!S><S>b +T21119.indexError: <1C1(L)><1!B><S!S><S>b T21119.throwIndexError: <MC1(L)><MA><L><L><L>x diff --git a/testsuite/tests/stranal/sigs/T21717.hs b/testsuite/tests/stranal/sigs/T21717.hs new file mode 100644 index 0000000000..f0d9b96a40 --- /dev/null +++ b/testsuite/tests/stranal/sigs/T21717.hs @@ -0,0 +1,12 @@ +module T21717 (g) where + +-- This is the original reproducer from #21717. +-- See T21717b for a reproducer that exhibited a crash. + +f :: Bool -> (Int, Int) +f True = (42,error "m") +f False = (error "m",42) + +g :: (Bool -> (Int, Int)) -> Int +g h = fst (h True) + snd (h False) +{-# NOINLINE g #-} diff --git a/testsuite/tests/stranal/sigs/T21717.stderr b/testsuite/tests/stranal/sigs/T21717.stderr new file mode 100644 index 0000000000..1dd0856f7b --- /dev/null +++ b/testsuite/tests/stranal/sigs/T21717.stderr @@ -0,0 +1,15 @@ + +==================== Strictness signatures ==================== +T21717.g: <SCS(P(ML,ML))> + + + +==================== Cpr signatures ==================== +T21717.g: 1 + + + +==================== Strictness signatures ==================== +T21717.g: <SCS(P(ML,ML))> + + diff --git a/testsuite/tests/stranal/sigs/T5075.stderr b/testsuite/tests/stranal/sigs/T5075.stderr index 9bc8301440..5b3701ef56 100644 --- a/testsuite/tests/stranal/sigs/T5075.stderr +++ b/testsuite/tests/stranal/sigs/T5075.stderr @@ -1,6 +1,6 @@ ==================== Strictness signatures ==================== -T5075.f: <S!P(A,A,SCS(C1(L)),A,A,A,A,A)><LP(A,A,LCS(C1(L)),A,A,A,LCS(L))><L> +T5075.f: <S!P(A,A,SCS(C1(L)),A,A,A,A,A)><LP(A,A,LCS(C1(L)),A,A,A,L)><L> T5075.g: <1L><S!P(L)> T5075.h: <S!P(L)> @@ -14,7 +14,7 @@ T5075.h: ==================== Strictness signatures ==================== -T5075.f: <1P(A,A,SCS(C1(L)),A,A,A,A,A)><LP(A,A,LCS(C1(L)),A,A,A,LCS(L))><L> +T5075.f: <1P(A,A,SCS(C1(L)),A,A,A,A,A)><LP(A,A,LCS(C1(L)),A,A,A,L)><L> T5075.g: <1L><S!P(L)> T5075.h: <1!P(L)> diff --git a/testsuite/tests/stranal/sigs/all.T b/testsuite/tests/stranal/sigs/all.T index 211cbda94d..50b8176ce8 100644 --- a/testsuite/tests/stranal/sigs/all.T +++ b/testsuite/tests/stranal/sigs/all.T @@ -33,5 +33,6 @@ test('T20746', normal, compile, ['']) test('T20746b', normal, compile, ['']) test('T21081', normal, compile, ['']) test('T21119', normal, compile, ['']) +test('T21717', normal, compile, ['']) test('T21888', normal, compile, ['']) test('T21888a', normal, compile, ['']) |