X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FcodeGen%2FCgCase.lhs;h=481ef028555ee57117af6791e0e1d57a91be8248;hb=bc28a1484c81da67373aa3b724f236e059b944a2;hp=b9c314919492e076ea0a3f681d8fa48a5612ed89;hpb=f5262d4457cabda7112af850d4659366a7ce34a1;p=ghc-hetmet.git diff --git a/ghc/compiler/codeGen/CgCase.lhs b/ghc/compiler/codeGen/CgCase.lhs index b9c3149..481ef02 100644 --- a/ghc/compiler/codeGen/CgCase.lhs +++ b/ghc/compiler/codeGen/CgCase.lhs @@ -1,7 +1,7 @@ % % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -% $Id: CgCase.lhs,v 1.41 2000/04/13 20:41:30 panne Exp $ +% $Id: CgCase.lhs,v 1.46 2000/09/06 12:21:15 simonmar Exp $ % %******************************************************** %* * @@ -25,7 +25,7 @@ import AbsCUtils ( mkAbstractCs, mkAbsCStmts, mkAlgAltsCSwitch, getAmodeRep, nonemptyAbsC ) import CgUpdate ( reserveSeqFrame ) -import CgBindery ( getVolatileRegs, getArgAmodes, getArgAmode, +import CgBindery ( getVolatileRegs, getArgAmodes, bindNewToReg, bindNewToTemp, bindNewPrimToAmode, rebindToStack, getCAddrMode, @@ -48,7 +48,6 @@ import CLabel ( CLabel, mkVecTblLabel, mkReturnPtLabel, ) import ClosureInfo ( mkLFArgument ) import CmdLineOpts ( opt_SccProfilingOn, opt_GranMacros ) -import CostCentre ( CostCentre ) import Id ( Id, idPrimRep, isDeadBinder ) import DataCon ( DataCon, dataConTag, fIRST_TAG, ConTag, isUnboxedTupleCon ) @@ -59,11 +58,10 @@ import PrimRep ( getPrimRepSize, retPrimRepSize, PrimRep(..) ) import TyCon ( TyCon, isEnumerationTyCon, isUnboxedTupleTyCon, isNewTyCon, isAlgTyCon, isFunTyCon, isPrimTyCon, - tyConDataCons, tyConFamilySize ) + ) import Type ( Type, typePrimRep, splitAlgTyConApp, splitTyConApp_maybe, repType ) -import PprType ( {- instance Outputable Type -} ) -import Unique ( Unique, Uniquable(..), mkPseudoUnique1 ) +import Unique ( Unique, Uniquable(..), newTagUnique ) import Maybes ( maybeToBool ) import Util import Outputable @@ -145,9 +143,10 @@ alternatives (in which case we lookup the tag in the relevant closure table to get the closure). Being a bit short of uniques for temporary variables here, we use -mkPseudoUnique1 to generate a temporary for the tag. We can't use -mkBuiltinUnique, because that occasionally clashes with some -temporaries generated for _ccall_GC, amongst others (see CgExpr.lhs). +newTagUnique to generate a new unique from the case binder. The case +binder's unique will presumably have the 'c' tag (generated by +CoreToStg), so we just change its tag to 'C' (for 'case') to ensure it +doesn't clash with anything else. \begin{code} cgCase (StgPrimApp op args res_ty) @@ -157,7 +156,7 @@ cgCase (StgPrimApp op args res_ty) let tag_amode = case op of TagToEnumOp -> only arg_amodes - _ -> CTemp (mkPseudoUnique1{-see above-} 1) IntRep + _ -> CTemp (newTagUnique (getUnique bndr) 'C') IntRep closure = CVal (CIndex (CLbl (mkClosureTblLabel tycon) PtrRep) tag_amode PtrRep) PtrRep in @@ -901,8 +900,6 @@ mkReturnVector :: Unique mkReturnVector uniq tagged_alt_absCs deflt_absC srt liveness ret_conv = getSRTLabel `thenFC` \srt_label -> let - srt_info = (srt_label, srt) - (return_vec_amode, vtbl_body) = case ret_conv of { -- might be a polymorphic case... @@ -950,7 +947,7 @@ mkReturnVector uniq tagged_alt_absCs deflt_absC srt liveness ret_conv deflt_lbl = case nonemptyAbsC deflt_absC of -- the simplifier might have eliminated a case - Nothing -> CLbl mkErrorStdEntryLabel CodePtrRep + Nothing -> mkIntCLit 0 -- CLbl mkErrorStdEntryLabel CodePtrRep Just absC@(CCodeBlock lbl _) -> CLbl lbl CodePtrRep mk_vector_entry :: ConTag -> (CAddrMode, AbstractC)