From 7cc05eb4300d3d9c60161898cd9bb9078eacbed5 Mon Sep 17 00:00:00 2001
From: simonmar <unknown>
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 7c7151af68f2..f380da953497 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
-- 
GitLab