Commit d21c80ea authored by's avatar
Browse files

Fix a nasty infelicity in the size computation of CoreUnfold

The size computation was treating gigantic case expressions as
practically free, which they really aren't.  It was exacerbated by
recent decisions to charge 0 for naked variables and constructors, so
the RHS of the case might look free too.  A good example was 
Foreign.C.Error.errnoToIOError, which hsa lots of join points
that were getting inlined way to vigorously, so we had:

  *** Simplifier Phase 2 [main]:
      Result size = 2983
  *** Core Linted result of Simplifier mode 2 [main], iteration 1 out of 4:
      Result size = 640327
  *** Core Linted result of Simplifier mode 2 [main], iteration 2 out of 4:
      Result size = 1659

Notice that gigantic intermediate!

This patch adds a small charge for each *alternative*.  Of course,
that'll also mean that there's a bit less inling of things involving
case expressions.
parent 8a85f89b
......@@ -319,9 +319,13 @@ sizeExpr bOMB_OUT_SIZE top_args expr
_ -> funSize top_args fun (length val_args)
size_up_alt (_con, _bndrs, rhs) = size_up rhs
size_up_alt (_con, _bndrs, rhs) = size_up rhs `addSizeN` 1
-- Don't charge for args, so that wrappers look cheap
-- (See comments about wrappers with Case)
-- IMPORATANT: *do* charge 1 for the alternative, else we
-- find that giant case nests are treated as practically free
-- A good example is Foreign.C.Error.errrnoToIOError
-- These addSize things have to be here because
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment