-Note [Passing the case binder to join points]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Suppose we have
- case e of cb { C1 -> r1[cb]; C2 x y z -> r2[cb,x] }
-and we want to make join points for the two alternatives,
-which mention the case binder 'cb'. Should we pass 'cb' to
-the join point, or reconstruct it? Here are the two alternatives
-for the C2 alternative:
-
- Plan A(pass cb): j2 cb x = r2[cb,x]
-
- Plan B(reconstruct cb): j2 x y z = let cb = C2 x y z in r2[cb,x]
-
-The advantge of Plan B is that we can "see" the definition of cb
-in r2, and that may be important when we inline stuff in r2. The
-disadvantage is that if this optimisation doesn't happen, we end up
-re-allocating C2, when it already exists. This does happen occasionally;
-an example is the function nofib/spectral/cichelli/Auxil.$whinsert.
-
-Plan B is always better if the constructor is nullary.
-
-In both cases we don't have liveness info for cb on a branch-by-branch
-basis, and it's possible that 'cb' is used in some branches but not
-others. Well, the absence analyser will find that out later, so it's
-not too bad.
-
-Sadly, at the time of writing, neither choice seems an unequivocal
-win. Here are nofib results, for adding -fpass-case-bndr-to-join-points
-(all others are zero effect):
-
- Program Size Allocs Runtime Elapsed
---------------------------------------------------------------------------------
- cichelli +0.0% -4.4% 0.13 0.13
- pic +0.0% -0.7% 0.01 0.04
- transform -0.0% +2.8% -0.4% -9.1%
- wave4main +0.0% +10.5% +3.1% +3.4%
---------------------------------------------------------------------------------
- Min -0.0% -4.4% -7.0% -31.9%
- Max +0.1% +10.5% +3.1% +15.0%
- Geometric Mean +0.0% +0.1% -1.7% -6.1%
-
-