summaryrefslogtreecommitdiff
path: root/compiler/workwrap/WwLib.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/workwrap/WwLib.hs')
-rw-r--r--compiler/workwrap/WwLib.hs18
1 files changed, 9 insertions, 9 deletions
diff --git a/compiler/workwrap/WwLib.hs b/compiler/workwrap/WwLib.hs
index 8720733d65..013ee3b5a1 100644
--- a/compiler/workwrap/WwLib.hs
+++ b/compiler/workwrap/WwLib.hs
@@ -18,7 +18,7 @@ import GhcPrelude
import BasicTypes
import CoreArity
import CoreSyn
-import CoreUtils ( exprType, mkCast )
+import CoreUtils ( exprType, mkCast, mkDefaultCase, mkSingleAltCase )
import Id
import IdInfo ( JoinArity, vanillaIdInfo )
import DataCon
@@ -32,7 +32,8 @@ import Literal ( absentLiteralOf )
import VarEnv ( mkInScopeSet )
import VarSet ( VarSet )
import Type
-import RepType ( isVoidTy )
+import Predicate ( isClassPred )
+import RepType ( isVoidTy, typePrimRep )
import Coercion
import FamInstEnv
import BasicTypes ( Boxity(..) )
@@ -141,7 +142,7 @@ mkWwBodies :: DynFlags
-- wrap_fn_str E = case x of { (a,b) ->
-- case a of { (a1,a2) ->
-- E a1 a2 b y }}
--- work_fn_str E = \a2 a2 b y ->
+-- work_fn_str E = \a1 a2 b y ->
-- let a = (a1,a2) in
-- let x = (a,b) in
-- E
@@ -153,14 +154,14 @@ mkWwBodies dflags fam_envs rhs_called_arity_map rhs_fvs fun_id demands res_info
; (wrap_args, wrap_fn_args, work_fn_args, res_ty)
<- mkWWargs empty_subst fun_ty demands
- ; (useful1, work_args, wrap_fn_str, work_fn_str)
+ ; (useful_str, work_args, wrap_fn_str, work_fn_str)
<- mkWWstr dflags fam_envs has_inlineable_prag wrap_args
-- Do CPR w/w. See Note [Always do CPR w/w]
- ; (useful2, wrap_fn_cpr, work_fn_cpr, cpr_res_ty)
+ ; (useful_cpr, wrap_fn_cpr, work_fn_cpr, cpr_res_ty)
<- mkWWcpr (gopt Opt_CprAnal dflags) fam_envs res_ty res_info
- ; (useful3, wrap_fn_eta_arity, work_fn_eta_arity, work_ty)
+ ; (useful_eta, wrap_fn_eta_arity, work_fn_eta_arity, work_ty)
<- mkWWetaArity do_eta_arity fun_id
; let (work_lam_args, work_call_args) = mkWorkerArgs dflags work_args cpr_res_ty
@@ -176,10 +177,9 @@ mkWwBodies dflags fam_envs rhs_called_arity_map rhs_fvs fun_id demands res_info
. work_fn_cpr
. work_fn_eta_arity
. work_fn_args
- ; if (useful3 && do_eta_arity)
- || (isWorkerSmallEnough dflags work_args
+ ; if isWorkerSmallEnough dflags work_args
&& not (too_many_args_for_join_point wrap_args)
- && ((useful1 && not only_one_void_argument) || useful2))
+ && ((useful_str && not only_one_void_argument) || useful_cpr || (useful_eta && do_eta_arity))
then return (Just (worker_args_dmds
,length work_call_args
,wrapper_body