Improve code generation for conditionals
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 8 Mar 2017 11:05:53 +0000 (11:05 +0000)
committerDavid Feuer <David.Feuer@gmail.com>
Fri, 28 Apr 2017 22:08:33 +0000 (18:08 -0400)
commit6d14c1485cb570cbd183bcdc0f858d9a6dc1eb31
tree5e5db9810a2e93a8f171015046532c5322a39b14
parent193664d42dbceadaa1e4689dfa17ff1cf5a405a0
Improve code generation for conditionals

This patch in in preparation for the fix to Trac #13397

The code generator has a special case for
  case tagToEnum (a>#b) of
    False -> e1
    True  -> e2

but it was not doing nearly so well on
  case a>#b of
    DEFAULT -> e1
    1#      -> e2

This patch arranges to behave essentially identically in
both cases.  In due course we can eliminate the special
case for tagToEnum#, once we've completed Trac #13397.

The changes are:

* Make CmmSink swizzle the order of a conditional where necessary;
  see Note [Improving conditionals] in CmmSink

* Hack the general case of StgCmmExpr.cgCase so that it use
  NoGcInAlts for conditionals.  This doesn't seem right, but it's
  the same choice as the tagToEnum version. Without it, code size
  increases a lot (more heap checks).

  There's a loose end here.

* Add comments in CmmOpt.cmmMachOpFoldM
compiler/cmm/CmmOpt.hs
compiler/cmm/CmmSink.hs
compiler/codeGen/StgCmmClosure.hs
compiler/codeGen/StgCmmExpr.hs
compiler/prelude/PrimOp.hs