On 14/06/2011 10:41, Simon Peyton-Jones wrote:
Yes one could do better.  But it's not particularly easy to do so.  So the 
cost-benefit ratio (where cost = implementation time, and resultant code 
complexity) didn't seem good to me.  I've fixed a crash, at the expense of 
de-optimising certain programs where you compile some modules with -O and 
others without.

Hmm, it's not just when you're using a mixture of -O0 and -O1, is it? The UNPACK is always ignored.

By all means make it better!

OK! (someday...)

Cheers,
        Simon


Simon

| -----Original Message-----
| From: Simon Marlow [mailto:[email protected]]
| Sent: 14 June 2011 10:02
| To: Simon Peyton-Jones
| Cc: [email protected]
| Subject: Re: [commit: ghc] master: Ignore UNPACK pragmas with 
OmitInterfacePragmas is
| on (fixes Trac #5252) (792449f)
|
| On 11/06/2011 14:53, Simon Peyton Jones wrote:
|>  Repository : ssh://darcs.haskell.org//srv/darcs/ghc
|>
|>  On branch  : master
|>
|>
| 
http://hackage.haskell.org/trac/ghc/changeset/792449f555bb4dfa8e718079f6d42dc9babe938
| a
|>
|>>  ---------------------------------------------------------------
|>
|>  commit 792449f555bb4dfa8e718079f6d42dc9babe938a
|>  Author: Simon Peyton Jones<[email protected]>
|>  Date:   Sat Jun 11 14:26:34 2011 +0100
|>
|>       Ignore UNPACK pragmas with OmitInterfacePragmas is on (fixes Trac 
#5252)
|>
|>       The point here is that if a data type chooses a representation that
|>       unpacks an argument field, the representation of the argument field
|>       must be visible to clients.  And it may not be if OmitInterfacePragmas
|>       is on.
|
| This seems a bit heavy-handed.  If the type being UNPACKed is from
| another module, then its representation must be available for UNPACK to
| work, and hence it will also be available to clients.  The problematic
| case is only when all 3 of these hold:
|
|   - the type being UNPACKed is defined in the current module
|   - it is not exported (or exported abstractly),
|   - and the type with the UNPACK pragma is exported concretely
|
| if any of these are false, we are OK.  I think it would help to at least
| check the first one - that would let the most common cases (e.g. UNPACK
| Int) to still work without -O.
|
| Cheers,
|       Simon
|
|
|
|>>  ---------------------------------------------------------------
|>
|>    compiler/typecheck/TcInstDcls.lhs   |    3 +-
|>    compiler/typecheck/TcTyClsDecls.lhs |   44 
+++++++++++++++++-----------------
|>    2 files changed, 23 insertions(+), 24 deletions(-)
|>
|>  diff --git a/compiler/typecheck/TcInstDcls.lhs 
b/compiler/typecheck/TcInstDcls.lhs
|>  index bb0089f..d4d8d2f 100644
|>  --- a/compiler/typecheck/TcInstDcls.lhs
|>  +++ b/compiler/typecheck/TcInstDcls.lhs
|>  @@ -665,7 +665,6 @@ tcFamInstDecl1 (decl@TyData {tcdND = new_or_data, 
tcdLName = L
| loc tc_name,
|>
|>             -- (2) type check indexed data type declaration
|>           ; tcTyVarBndrs k_tvs $ \t_tvs ->   do {  -- turn kinded into 
proper tyvars
|>  -       ; unbox_strict<- doptM Opt_UnboxStrictFields
|>
|>             -- kind check the type indexes and the context
|>           ; t_typats<- mapM tcHsKindedType k_typats
|>  @@ -684,7 +683,7 @@ tcFamInstDecl1 (decl@TyData {tcdND = new_or_data, 
tcdLName = L
| loc tc_name,
|>           ; let ex_ok = True      -- Existentials ok for type families!
|>           ; fixM (\ rep_tycon ->   do
|>           { let orig_res_ty = mkTyConApp fam_tycon t_typats
|>  -             ; data_cons<- tcConDecls unbox_strict ex_ok rep_tycon
|>  +             ; data_cons<- tcConDecls ex_ok rep_tycon
|>                                   (t_tvs, orig_res_ty) k_cons
|>           ; tc_rhs<-
|>                   case new_or_data of
|>  diff --git a/compiler/typecheck/TcTyClsDecls.lhs
| b/compiler/typecheck/TcTyClsDecls.lhs
|>  index 8d62b78..ca4f2c5 100644
|>  --- a/compiler/typecheck/TcTyClsDecls.lhs
|>  +++ b/compiler/typecheck/TcTyClsDecls.lhs
|>  @@ -482,7 +482,6 @@ tcTyClDecl1 _parent calc_isrec
|>      { extra_tvs<- tcDataKindSig mb_ksig
|>      ; let final_tvs = tvs' ++ extra_tvs
|>      ; stupid_theta<- tcHsKindedContext ctxt
|>  -  ; unbox_strict<- doptM Opt_UnboxStrictFields
|>      ; kind_signatures<- xoptM Opt_KindSignatures
|>      ; existential_ok<- xoptM Opt_ExistentialQuantification
|>      ; gadt_ok<- xoptM Opt_GADTs
|>  @@ -496,8 +495,7 @@ tcTyClDecl1 _parent calc_isrec
|>
|>      ; tycon<- fixM (\ tycon ->   do
|>           { let res_ty = mkTyConApp tycon (mkTyVarTys final_tvs)
|>  -        ; data_cons<- tcConDecls unbox_strict ex_ok
|>  -                                  tycon (final_tvs, res_ty) cons
|>  +        ; data_cons<- tcConDecls ex_ok tycon (final_tvs, res_ty) cons
|>           ; tc_rhs<-
|>           if null cons&&   is_boot        -- In a hs-boot file, empty cons 
means
|>           then return AbstractTyCon       -- "don't know"; hence Abstract
|>  @@ -585,19 +583,18 @@ dataDeclChecks tc_name new_or_data stupid_theta cons
|>                    (emptyConDeclsErr tc_name) }
|>
|>    -----------------------------------
|>  -tcConDecls :: Bool ->   Bool ->   TyCon ->   ([TyVar], Type)
|>  +tcConDecls :: Bool ->   TyCon ->   ([TyVar], Type)
|>           ->   [LConDecl Name] ->   TcM [DataCon]
|>  -tcConDecls unbox ex_ok rep_tycon res_tmpl cons
|>  -  = mapM (addLocM (tcConDecl unbox ex_ok rep_tycon res_tmpl)) cons
|>  +tcConDecls ex_ok rep_tycon res_tmpl cons
|>  +  = mapM (addLocM (tcConDecl ex_ok rep_tycon res_tmpl)) cons
|>
|>  -tcConDecl :: Bool               -- True<=>   -funbox-strict_fields
|>  -          ->   Bool          -- True<=>   -XExistentialQuantificaton or 
-XGADTs
|>  +tcConDecl :: Bool               -- True<=>   -XExistentialQuantificaton or 
-XGADTs
|>           ->   TyCon           -- Representation tycon
|>           ->   ([TyVar], Type) -- Return type template (with its template 
tyvars)
|>           ->   ConDecl Name
|>           ->   TcM DataCon
|>
|>  -tcConDecl unbox_strict existential_ok rep_tycon res_tmpl        -- Data 
types
|>  +tcConDecl existential_ok rep_tycon res_tmpl     -- Data types
|>           con@(ConDecl {con_name = name, con_qvars = tvs, con_cxt = ctxt
|>                       , con_details = details, con_res = res_ty })
|>      = addErrCtxt (dataConCtxt name)      $
|>  @@ -608,7 +605,7 @@ tcConDecl unbox_strict existential_ok rep_tycon 
res_tmpl     --
| Data types
|>        ; (univ_tvs, ex_tvs, eq_preds, res_ty')<- tcResultType res_tmpl tvs' 
res_ty
|>        ; let
|>           tc_datacon is_infix field_lbls btys
|>  -          = do { (arg_tys, stricts)<- mapAndUnzipM (tcConArg unbox_strict) 
btys
|>  +          = do { (arg_tys, stricts)<- mapAndUnzipM tcConArg btys
|>           ; buildDataCon (unLoc name) is_infix
|>                   stricts field_lbls
|>                   univ_tvs ex_tvs eq_preds ctxt' arg_tys
|>  @@ -714,13 +711,10 @@ conRepresentibleWithH98Syntax
|>              f _ _ = False
|>
|>    -------------------
|>  -tcConArg :: Bool                -- True<=>   -funbox-strict_fields
|>  -           ->   LHsType Name
|>  -           ->   TcM (TcType, HsBang)
|>  -tcConArg unbox_strict bty
|>  +tcConArg :: LHsType Name ->   TcM (TcType, HsBang)
|>  +tcConArg bty
|>      = do  { arg_ty<- tcHsBangType bty
|>  -        ; let bang = getBangStrictness bty
|>  -        ; let strict_mark = chooseBoxingStrategy unbox_strict arg_ty bang
|>  +        ; strict_mark<- chooseBoxingStrategy arg_ty (getBangStrictness bty)
|>           ; return (arg_ty, strict_mark) }
|>
|>    -- We attempt to unbox/unpack a strict field when either:
|>  @@ -729,13 +723,19 @@ tcConArg unbox_strict bty
|>    --
|>    -- We have turned off unboxing of newtypes because coercions make unboxing
|>    -- and reboxing more complicated
|>  -chooseBoxingStrategy :: Bool ->   TcType ->   HsBang ->   HsBang
|>  -chooseBoxingStrategy unbox_strict_fields arg_ty bang
|>  +chooseBoxingStrategy :: TcType ->   HsBang ->   TcM HsBang
|>  +chooseBoxingStrategy arg_ty bang
|>      = case bang of
|>  -        HsNoBang                        ->   HsNoBang
|>  -        HsUnpack                        ->   can_unbox HsUnpackFailed 
arg_ty
|>  -        HsStrict | unbox_strict_fields  ->   can_unbox HsStrict       
arg_ty
|>  -                 | otherwise            ->   HsStrict
|>  +        HsNoBang ->   return HsNoBang
|>  +        HsStrict ->   do { unbox_strict<- doptM Opt_UnboxStrictFields
|>  +                       ; if unbox_strict then return (can_unbox HsStrict 
arg_ty)
|>  +                                         else return HsStrict }
|>  +        HsUnpack ->   do { omit_prags<- doptM Opt_OmitInterfacePragmas
|>  +            -- Do not respect UNPACK pragmas if OmitInterfacePragmas is on
|>  +            -- See Trac #5252: unpacking means we must not conceal the
|>  +            --                 representation of the argument type
|>  +                       ; if omit_prags then return HsStrict
|>  +                                       else return (can_unbox 
HsUnpackFailed
| arg_ty) }
|>           HsUnpackFailed ->   pprPanic "chooseBoxingStrategy" (ppr arg_ty)
|>                           -- Source code never has shtes
|>      where
|>
|>
|>
|>  _______________________________________________
|>  Cvs-ghc mailing list
|>  [email protected]
|>  http://www.haskell.org/mailman/listinfo/cvs-ghc
|



_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to