From: simonmar Date: Mon, 4 Sep 2000 14:10:38 +0000 (+0000) Subject: [project @ 2000-09-04 14:10:38 by simonmar] X-Git-Tag: Approximately_9120_patches~3809 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=7cc05eb4300d3d9c60161898cd9bb9078eacbed5;p=ghc-hetmet.git [project @ 2000-09-04 14:10:38 by simonmar] Convert one of the alternatives in an algebraic switch into the default, if we don't already have a default. This generates better code in particular for inline comparison primops. Noticed by: Qrczak --- diff --git a/ghc/compiler/absCSyn/AbsCUtils.lhs b/ghc/compiler/absCSyn/AbsCUtils.lhs index 7c7151a..f380da9 100644 --- a/ghc/compiler/absCSyn/AbsCUtils.lhs +++ b/ghc/compiler/absCSyn/AbsCUtils.lhs @@ -28,10 +28,11 @@ import Unique ( Unique{-instance Eq-} ) import UniqSupply ( uniqFromSupply, uniqsFromSupply, splitUniqSupply, UniqSupply ) import CmdLineOpts ( opt_OutputLanguage, opt_EmitCExternDecls ) -import Maybes ( maybeToBool ) import PrimOp ( PrimOp(..), CCall(..), isDynamicTarget ) import Panic ( panic ) +import Maybe ( isJust ) + infixr 9 `thenFlt` \end{code} @@ -101,8 +102,16 @@ mkAbsCStmtList' other r = other : r mkAlgAltsCSwitch :: CAddrMode -> [(ConTag, AbstractC)] -> AbstractC -> AbstractC mkAlgAltsCSwitch scrutinee tagged_alts deflt_absc - = CSwitch scrutinee (adjust tagged_alts) deflt_absc + | isJust (nonemptyAbsC deflt_absc) + = CSwitch scrutinee (adjust tagged_alts) deflt_absc + | otherwise + = CSwitch scrutinee (adjust rest) first_alt where + -- it's ok to convert one of the alts into a default if we don't already have + -- one, because this is an algebraic case and we're guaranteed that the tag + -- will match one of the branches. + ((tag,first_alt):rest) = tagged_alts + -- Adjust the tags in the switch to start at zero. -- This is the convention used by primitive ops which return algebraic -- data types. Why? Because for two-constructor types, zero is faster