X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FcodeGen%2FStgCmmExpr.hs;h=50d500bc8c04a69024a4671f9b85b8e3d51479e0;hb=83d563cb9ede0ba792836e529b1e2929db926355;hp=28c74427b00379cd20647b1fcb62d8a290ea25c3;hpb=bfb346895846c5b79ecfb1e7503815146b8a4071;p=ghc-hetmet.git diff --git a/compiler/codeGen/StgCmmExpr.hs b/compiler/codeGen/StgCmmExpr.hs index 28c7442..50d500b 100644 --- a/compiler/codeGen/StgCmmExpr.hs +++ b/compiler/codeGen/StgCmmExpr.hs @@ -40,6 +40,7 @@ import SMRep import TyCon import Type import CostCentre ( CostCentreStack, currentCCS ) +import Control.Monad (when) import Maybes import Util import FastString @@ -301,28 +302,26 @@ cgCase (OpApp ) bndr srt AlgAlt [(DataAlt flase, a2] -- code that enters the HValue, then we'll get a runtime panic, because -- the HValue really is a MutVar#. The types are compatible though, -- so we can just generate an assignment. -cgCase scrut@(StgApp v []) bndr _ alt_type@(PrimAlt _) alts +cgCase (StgApp v []) bndr _ alt_type@(PrimAlt _) alts | isUnLiftedType (idType v) || reps_compatible - = -- assignment instruction suffices for unlifted types - do { v_info <- getCgIdInfo v - ; emit $ mkComment $ mkFastString "New case:" + = -- assignment suffices for unlifted types + do { when (not reps_compatible) $ + panic "cgCase: reps do not match, perhaps a dodgy unsafeCoerce?" + ; v_info <- getCgIdInfo v ; emit (mkAssign (CmmLocal (idToReg (NonVoid bndr))) (idInfoToAmode v_info)) ; _ <- bindArgsToRegs [NonVoid bndr] ; cgAlts NoGcInAlts (NonVoid bndr) alt_type alts } where reps_compatible = idCgRep v == idCgRep bndr -cgCase scrut@(StgApp v []) bndr _ (PrimAlt _) _ - | lifted +cgCase scrut@(StgApp v []) _ _ (PrimAlt _) _ = -- fail at run-time, not compile-time do { mb_cc <- maybeSaveCostCentre True ; withSequel (AssignTo [idToReg (NonVoid v)] False) (cgExpr scrut) ; restoreCurrentCostCentre mb_cc ; emit $ mkComment $ mkFastString "should be unreachable code" ; emit $ withFreshLabel "l" (\l -> mkLabel l <*> mkBranch l)} - where - lifted = not (isUnLiftedType (idType v)) cgCase scrut bndr srt alt_type alts = -- the general case