projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revised signature of tcLookupFamInst and lookupFamInstEnv
[ghc-hetmet.git]
/
compiler
/
codeGen
/
CgUtils.hs
diff --git
a/compiler/codeGen/CgUtils.hs
b/compiler/codeGen/CgUtils.hs
index
ab39080
..
0e8d6c8
100644
(file)
--- a/
compiler/codeGen/CgUtils.hs
+++ b/
compiler/codeGen/CgUtils.hs
@@
-26,7
+26,7
@@
module CgUtils (
addToMem, addToMemE,
mkWordCLit,
addToMem, addToMemE,
mkWordCLit,
- mkStringCLit,
+ mkStringCLit, mkByteStringCLit,
packHalfWordsCLit,
blankWord
) where
packHalfWordsCLit,
blankWord
) where
@@
-474,15
+474,18
@@
mk_switch tag_expr branches mb_deflt lo_tag hi_tag via_C
where
use_switch = {- pprTrace "mk_switch" (
ppr tag_expr <+> text "n_tags:" <+> int n_tags <+>
where
use_switch = {- pprTrace "mk_switch" (
ppr tag_expr <+> text "n_tags:" <+> int n_tags <+>
+ text "branches:" <+> ppr (map fst branches) <+>
text "n_branches:" <+> int n_branches <+>
text "n_branches:" <+> int n_branches <+>
- text "lo_tag: " <+> int lo_tag <+>
- text "hi_tag: " <+> int hi_tag <+>
- text "real_lo_tag: " <+> int real_lo_tag <+>
- text "real_hi_tag: " <+> int real_hi_tag) $ -}
+ text "lo_tag:" <+> int lo_tag <+>
+ text "hi_tag:" <+> int hi_tag <+>
+ text "real_lo_tag:" <+> int real_lo_tag <+>
+ text "real_hi_tag:" <+> int real_hi_tag) $ -}
ASSERT( n_branches > 1 && n_tags > 1 )
ASSERT( n_branches > 1 && n_tags > 1 )
- n_tags > 2 && (small || dense || via_C)
- -- a 2-branch switch always turns into an if.
- small = n_tags <= 4
+ n_tags > 2 && (via_C || (dense && big_enough))
+ -- up to 4 branches we use a decision tree, otherwise
+ -- a switch (== jump table in the NCG). This seems to be
+ -- optimal, and corresponds with what gcc does.
+ big_enough = n_branches > 4
dense = n_branches > (n_tags `div` 2)
n_branches = length branches
dense = n_branches > (n_tags `div` 2)
n_branches = length branches