[GHC] #10129: emitCmmLitSwitch could be better

GHC ghc-devs at haskell.org
Mon Mar 2 18:58:40 UTC 2015


#10129: emitCmmLitSwitch could be better
-------------------------------------+-------------------------------------
              Reporter:  nomeata     |             Owner:
                  Type:  task        |            Status:  new
              Priority:  normal      |         Milestone:
             Component:  Compiler    |           Version:  7.8.4
  (CodeGen)                          |  Operating System:  Unknown/Multiple
              Keywords:              |   Type of failure:  None/Unknown
          Architecture:              |        Blocked By:
  Unknown/Multiple                   |   Related Tickets:
             Test Case:              |
              Blocking:              |
Differential Revisions:              |
-------------------------------------+-------------------------------------
 This is a spin off #10124. While looking at the code generated for

 {{{
 f :: Int -> Bool
 f a = case a of
         1  -> True
         2  -> True
         3  -> True
         4  -> True
         8  -> True
         9  -> True
         11 -> True
         19 -> True
         _  -> False
 }}}

 I noticed this Cmm:

 {{{
        c2tI:
            if (%MO_S_Lt_W64(_s2sJ::I64, 3)) goto c2tw; else goto c2tx;
        c2tw:
            if (%MO_S_Lt_W64(_s2sJ::I64, 2)) goto c2tq; else goto c2tr;
        c2tq:
            if (_s2sJ::I64 != 1) goto c2tg; else goto c2th;
        c2tr:
            if (_s2sJ::I64 != 2) goto c2tg; else goto c2th;
 }}}

 Note that when `c2tr` is reached, we know 2 ≤ _s2sJ < 3, so  _s2sJ already
 is 2, and this check is redundant.

 `emitCmmLitSwitch` does not take that into account, probably because it
 also needs to work for floats.

 I wonder if it isn’t a bit shady to use an if-then-else tree for floats.
 Maybe for float types, a sequence of equality tests is more suitable. For
 all other cases, the code generator could make use of "2 ≤ x < 3 ⇒ x = 2"
 and skip one check.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10129>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list