From 7cc05eb4300d3d9c60161898cd9bb9078eacbed5 Mon Sep 17 00:00:00 2001 From: simonmar Date: Mon, 4 Sep 2000 14:10:38 +0000 Subject: [PATCH] [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 --- ghc/compiler/absCSyn/AbsCUtils.lhs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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 -- 1.7.10.4