From: Manuel M T Chakravarty Date: Tue, 2 Oct 2007 13:04:07 +0000 (+0000) Subject: FIX: mkWWcpr takes open alg types into account X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=4ff3da9aa11dc1c5d00f03248dc41c7d84309fa1 FIX: mkWWcpr takes open alg types into account - This fixed the failures of GMapAssoc and GMapTop for optmising ways MERGE TO STABLE --- diff --git a/compiler/stranal/WwLib.lhs b/compiler/stranal/WwLib.lhs index 31d0990..d066f44 100644 --- a/compiler/stranal/WwLib.lhs +++ b/compiler/stranal/WwLib.lhs @@ -27,9 +27,7 @@ import NewDemand ( Demand(..), DmdResult(..), Demands(..) ) import MkId ( realWorldPrimId, voidArgId, mkRuntimeErrorApp, rUNTIME_ERROR_ID, mkUnpackCase, mkProductBox ) import TysWiredIn ( tupleCon ) -import Type ( Type, isUnLiftedType, mkFunTys, - splitForAllTys, splitFunTys, isAlgType - ) +import Type import Coercion ( mkSymCoercion, splitNewTypeRepCo_maybe ) import BasicTypes ( Boxity(..) ) import Var ( Var, isId ) @@ -422,8 +420,9 @@ mkWWcpr :: Type -- function body type Type) -- Type of worker's body mkWWcpr body_ty RetCPR - | not (isAlgType body_ty) - = WARN( True, text "mkWWcpr: non-algebraic body type" <+> ppr body_ty ) + | not (isClosedAlgType body_ty) + = WARN( True, + text "mkWWcpr: non-algebraic or open body type" <+> ppr body_ty ) returnUs (id, id, body_ty) | n_con_args == 1 && isUnLiftedType con_arg_ty1 diff --git a/compiler/types/Type.lhs b/compiler/types/Type.lhs index 8c96922..ab47c4c 100644 --- a/compiler/types/Type.lhs +++ b/compiler/types/Type.lhs @@ -67,8 +67,8 @@ module Type ( newTyConInstRhs, -- Lifting and boxity - isUnLiftedType, isUnboxedTupleType, isAlgType, isPrimitiveType, - isStrictType, isStrictPred, + isUnLiftedType, isUnboxedTupleType, isAlgType, isClosedAlgType, + isPrimitiveType, isStrictType, isStrictPred, -- Free variables tyVarsOfType, tyVarsOfTypes, tyVarsOfPred, tyVarsOfTheta, @@ -861,10 +861,19 @@ isUnboxedTupleType ty = case splitTyConApp_maybe ty of -- Should only be applied to *types*; hence the assert isAlgType :: Type -> Bool -isAlgType ty = case splitTyConApp_maybe ty of - Just (tc, ty_args) -> ASSERT( ty_args `lengthIs` tyConArity tc ) - isAlgTyCon tc - other -> False +isAlgType ty + = case splitTyConApp_maybe ty of + Just (tc, ty_args) -> ASSERT( ty_args `lengthIs` tyConArity tc ) + isAlgTyCon tc + _other -> False + +-- Should only be applied to *types*; hence the assert +isClosedAlgType :: Type -> Bool +isClosedAlgType ty + = case splitTyConApp_maybe ty of + Just (tc, ty_args) -> ASSERT( ty_args `lengthIs` tyConArity tc ) + isAlgTyCon tc && not (isOpenTyCon tc) + _other -> False \end{code} @isStrictType@ computes whether an argument (or let RHS) should