From dea97ac372ee53bd337907910e6269ad0cb31aca Mon Sep 17 00:00:00 2001 From: simonm Date: Fri, 7 May 1999 13:44:00 +0000 Subject: [PATCH] [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. --- ghc/compiler/codeGen/CgExpr.lhs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) 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 -- 1.7.10.4