From: simonm Date: Fri, 7 May 1999 13:44:00 +0000 (+0000) Subject: [project @ 1999-05-07 13:44:00 by simonm] X-Git-Tag: Approximately_9120_patches~6245 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=dea97ac372ee53bd337907910e6269ad0cb31aca;p=ghc-hetmet.git [project @ 1999-05-07 13:44:00 by simonm] Fix bug in tagToEnum#: if the amode of the tag overlapped with node, bogus code would be generated. Now load the tag into a temporary before doing the table lookup. --- diff --git a/ghc/compiler/codeGen/CgExpr.lhs b/ghc/compiler/codeGen/CgExpr.lhs index 7b11429..5c4cd9b 100644 --- a/ghc/compiler/codeGen/CgExpr.lhs +++ b/ghc/compiler/codeGen/CgExpr.lhs @@ -1,7 +1,7 @@ % % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -% $Id: CgExpr.lhs,v 1.23 1999/04/23 13:53:29 simonm Exp $ +% $Id: CgExpr.lhs,v 1.24 1999/05/07 13:44:00 simonm Exp $ % %******************************************************** %* * @@ -126,17 +126,19 @@ cgExpr (StgCon (PrimOp op@(CCallOp _ _ may_gc@True _)) args res_ty) -- and perform an appropriate return. cgExpr (StgCon (PrimOp TagToEnumOp) [arg] res_ty) - | isEnumerationTyCon tycon = - getArgAmode arg `thenFC` \amode -> - performReturn (CAssign (CReg node) + = ASSERT(isEnumerationTyCon tycon) + getArgAmode arg `thenFC` \amode -> + -- save the tag in a temporary in case amode overlaps + -- with node. + absC (CAssign dyn_tag amode) `thenC` + performReturn ( + CAssign (CReg node) (CTableEntry (CLbl (mkClosureTblLabel tycon) PtrRep) - amode PtrRep)) - (\ sequel -> mkDynamicAlgReturnCode tycon amode sequel) - - | otherwise = panic "cgExpr: tagToEnum# of non-enumerated type" - + dyn_tag PtrRep)) + (\ sequel -> mkDynamicAlgReturnCode tycon dyn_tag sequel) where + dyn_tag = CTemp (mkBuiltinUnique 0) IntRep (Just (tycon,_)) = splitTyConApp_maybe res_ty