summaryrefslogtreecommitdiff
path: root/testsuite/tests/simplCore/should_compile/OpaqueNoRebox3.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/simplCore/should_compile/OpaqueNoRebox3.hs')
-rw-r--r--testsuite/tests/simplCore/should_compile/OpaqueNoRebox3.hs43
1 files changed, 43 insertions, 0 deletions
diff --git a/testsuite/tests/simplCore/should_compile/OpaqueNoRebox3.hs b/testsuite/tests/simplCore/should_compile/OpaqueNoRebox3.hs
new file mode 100644
index 0000000000..887e40a432
--- /dev/null
+++ b/testsuite/tests/simplCore/should_compile/OpaqueNoRebox3.hs
@@ -0,0 +1,43 @@
+module OpaqueNoRebox3 where
+
+f :: Int -> Int
+f x = x `seq` (x + 1)
+{-# OPAQUE f #-}
+
+-- Historical note:
+--
+-- Since no W/W happens for f because it is OPAQUE, currently, the worker for g
+-- does the dreaded reboxing of p similar to what is mentioned in
+-- https://gitlab.haskell.org/ghc/ghc/-/issues/13143
+--
+-- 16-Nov-2021, Sebastian Graf says:
+-- "Right, this is again not related to correct handling of OPAQUE but rather a
+-- weakness in boxity analysis at the moment. this is because when boxity
+-- analysis sees a `Case`, it will look at its `Alt`s. If one of the `Alt`
+-- says `Unboxed`, we let the `Unboxed` win. We'd only say Boxed if all the Alts
+-- had Boxed occs or if the scrutinee (or any of the occurrences that happen as
+-- part of the same trace, guaranteed) had a Boxed occ. It's kind of a necessary
+-- work-around until we have boxity analysis integrate with CPR analysis."
+--
+-- See Note [The OPAQUE pragma and avoiding the reboxing of arguments]
+--
+-- 16-Mar-2022:
+-- With https://gitlab.haskell.org/ghc/ghc/-/merge_requests/7609 merged, we no
+-- longer get a reboxing worker for g
+g :: Bool -> Bool -> Bool -> Int -> Int
+g = \w w1 w2 p ->
+ let fail_ = case w1 of
+ False -> case w2 of
+ False -> g w True w2 p
+ True -> f (f p)
+ True -> error "patError"
+ in case w of
+ False -> case w1 of
+ False -> fail_
+ True -> case w2 of
+ False -> p + 1
+ True -> fail_
+ True -> case w1 of
+ False -> fail_
+ True -> case w2 of
+ _ -> f p