From a32098431939d2411798312b11f18cf99e9f724b Mon Sep 17 00:00:00 2001 From: "mrchebas@gmail.com" Date: Fri, 19 Jan 2007 15:07:49 +0000 Subject: [PATCH] don't make jump tables for small switches (<= 4 branches) Only affects -fasm: gcc makes its own decisions about jump tables --- compiler/codeGen/CgUtils.hs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/compiler/codeGen/CgUtils.hs b/compiler/codeGen/CgUtils.hs index ab39080..29b972c 100644 --- a/compiler/codeGen/CgUtils.hs +++ b/compiler/codeGen/CgUtils.hs @@ -480,9 +480,11 @@ mk_switch tag_expr branches mb_deflt lo_tag hi_tag via_C text "real_lo_tag: " <+> int real_lo_tag <+> text "real_hi_tag: " <+> int real_hi_tag) $ -} 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 -- 1.7.10.4