diff options
author | Sebastian Graf <sebastian.graf@kit.edu> | 2022-11-04 15:30:00 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-11-10 21:16:01 -0500 |
commit | 1230c2689db2e510b5a9b280c1a4eca832c23ccc (patch) | |
tree | b9f053784628d8bb368fca2cf35d482dd34f84e0 /testsuite/tests/stranal | |
parent | dac0682aa57db284f858a57393ee6f32c5314562 (diff) | |
download | haskell-1230c2689db2e510b5a9b280c1a4eca832c23ccc.tar.gz |
Boxity: Handle argument budget of unboxed tuples correctly (#21737)
Now Budget roughly tracks the combined width of all arguments after unarisation.
See the changes to `Note [Worker argument budgets]`.
Fixes #21737.
Diffstat (limited to 'testsuite/tests/stranal')
-rw-r--r-- | testsuite/tests/stranal/sigs/T21737.hs | 47 | ||||
-rw-r--r-- | testsuite/tests/stranal/sigs/T21737.stderr | 30 | ||||
-rw-r--r-- | testsuite/tests/stranal/sigs/all.T | 1 |
3 files changed, 78 insertions, 0 deletions
diff --git a/testsuite/tests/stranal/sigs/T21737.hs b/testsuite/tests/stranal/sigs/T21737.hs new file mode 100644 index 0000000000..e07365cab8 --- /dev/null +++ b/testsuite/tests/stranal/sigs/T21737.hs @@ -0,0 +1,47 @@ +{-# OPTIONS_GHC -fmax-worker-args=4 #-} + +{-# LANGUAGE MagicHash, UnboxedTuples #-} + +-- See Note [Worker argument budget] +module T21737 where + +data T = MkT (# Int, Int, Int, Int #) + +-- NB: -fmax-worker-args=4 at the top of this file! +-- We should unbox through the unboxed pair but not T +{-# NOINLINE f #-} +f :: Int -> (# Int, Int #) -> T -> Int +f x (# y, z #) (MkT (# x1, x2, x3, x4 #)) = x + y + z + x1 + x2 + x3 + x4 + +-- NB: -fmax-worker-args=4 at the top of this file! +-- Do split the triple *even if* that gets us to 6 args, +-- because the triple will take 3 registers anyway (not 1) +-- and we get to unbox a b c. +yes :: (# Int, Int, Int #) -> Int -> Int -> Int -> Int +yes (# a, b, c #) d e f = a + b + c + d + e + f +{-# NOINLINE yes #-} + +data U = MkU (# Int, Int, Int, Int, Int, Int #) + +-- NB: -fmax-worker-args=4 at the top of this file! +-- Don't unbox U, because then we'll pass an unboxed 6-tuple, all in registers. +no :: U -> Int +no (MkU (# a, b, c, d, e, f #)) = a + b + c + d + e + f +{-# NOINLINE no #-} + +-- NB: -fmax-worker-args=4 at the top of this file! +-- Hence do not unbox the nested triple. +boxed :: (Int, Int) -> (Int, (Int, Int, Int)) -> Int +boxed (a,b) (c, (d,e,f)) = a + b + c + d + e + f +{-# NOINLINE boxed #-} + +-- NB: -fmax-worker-args=4 at the top of this file! +-- Do split the inner unboxed triple *even if* that gets us to 5 args, because +-- the function will take 5 args anyway. But don't split the pair! +unboxed :: (Int, Int) -> (# Int, (# Int, Int, Int #) #) -> Int +unboxed (a,b) (# c, (# d, e, f #) #) = a + b + c + d + e + f +{-# NOINLINE unboxed #-} + +-- Point: Demand on `x` is lazy and thus Unboxed +app :: ((# Int, Int #) -> (# Int, Int #)) -> (# Int, Int #) -> (# Int, Int #) +app g x = g x diff --git a/testsuite/tests/stranal/sigs/T21737.stderr b/testsuite/tests/stranal/sigs/T21737.stderr new file mode 100644 index 0000000000..fe4d92b628 --- /dev/null +++ b/testsuite/tests/stranal/sigs/T21737.stderr @@ -0,0 +1,30 @@ + +==================== Strictness signatures ==================== +T21737.app: <1C(1,L)><L> +T21737.boxed: <1!P(1!P(L),1!P(L))><1!P(1!P(L),1P(1L,1L,1L))> +T21737.f: <1!P(L)><1!P(1!P(L),1!P(L))><1P(1P(1L,1L,1L,1L))> +T21737.no: <1P(1P(1L,1L,1L,1L,1L,1L))> +T21737.unboxed: <1P(1L,1L)><1!P(1!P(L),1!P(1!P(L),1!P(L),1!P(L)))> +T21737.yes: <1!P(1!P(L),1!P(L),1!P(L))><1!P(L)><1!P(L)><1!P(L)> + + + +==================== Cpr signatures ==================== +T21737.app: +T21737.boxed: 1 +T21737.f: 1 +T21737.no: 1 +T21737.unboxed: 1 +T21737.yes: 1 + + + +==================== Strictness signatures ==================== +T21737.app: <1C(1,L)><L> +T21737.boxed: <1!P(1!P(L),1!P(L))><1!P(1!P(L),1P(1L,1L,1L))> +T21737.f: <1!P(L)><1!P(1!P(L),1!P(L))><1P(1P(1L,1L,1L,1L))> +T21737.no: <1P(1P(1L,1L,1L,1L,1L,1L))> +T21737.unboxed: <1P(1L,1L)><1!P(1!P(L),1!P(1!P(L),1!P(L),1!P(L)))> +T21737.yes: <1!P(1!P(L),1!P(L),1!P(L))><1!P(L)><1!P(L)><1!P(L)> + + diff --git a/testsuite/tests/stranal/sigs/all.T b/testsuite/tests/stranal/sigs/all.T index 01ea48cfe8..24969391b7 100644 --- a/testsuite/tests/stranal/sigs/all.T +++ b/testsuite/tests/stranal/sigs/all.T @@ -38,3 +38,4 @@ test('T21754', normal, compile, ['']) test('T21888', normal, compile, ['']) test('T21888a', normal, compile, ['']) test('T22241', normal, compile, ['']) +test('T21737', normal, compile, ['']) |