[commit: ghc] master: Comments only (d6ed4df)
git at git.haskell.org
git at git.haskell.org
Fri Oct 18 11:26:45 UTC 2013
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/d6ed4df4ae1f6efea86378e97efdd26b81285a48/ghc
>---------------------------------------------------------------
commit d6ed4df4ae1f6efea86378e97efdd26b81285a48
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Thu Oct 17 15:18:17 2013 +0100
Comments only
>---------------------------------------------------------------
d6ed4df4ae1f6efea86378e97efdd26b81285a48
compiler/simplCore/Simplify.lhs | 63 +++++++++++++++++++++++----------------
1 file changed, 38 insertions(+), 25 deletions(-)
diff --git a/compiler/simplCore/Simplify.lhs b/compiler/simplCore/Simplify.lhs
index a0bd7f8..2c1b01b 100644
--- a/compiler/simplCore/Simplify.lhs
+++ b/compiler/simplCore/Simplify.lhs
@@ -2609,32 +2609,40 @@ type varaibles as well as term variables.
case (case e of ...) of
C t xs::[t] -> j t xs
-Note [Join point abstaction]
+Note [Join point abstraction]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-If we try to lift a primitive-typed something out
-for let-binding-purposes, we will *caseify* it (!),
-with potentially-disastrous strictness results. So
-instead we turn it into a function: \v -> e
-where v::State# RealWorld#. The value passed to this function
-is realworld#, which generates (almost) no code.
-
-There's a slight infelicity here: we pass the overall
-case_bndr to all the join points if it's used in *any* RHS,
-because we don't know its usage in each RHS separately
-
-We used to say "&& isUnLiftedType rhs_ty'" here, but now
-we make the join point into a function whenever used_bndrs'
-is empty. This makes the join-point more CPR friendly.
-Consider: let j = if .. then I# 3 else I# 4
- in case .. of { A -> j; B -> j; C -> ... }
-
-Now CPR doesn't w/w j because it's a thunk, so
-that means that the enclosing function can't w/w either,
-which is a lose. Here's the example that happened in practice:
- kgmod :: Int -> Int -> Int
- kgmod x y = if x > 0 && y < 0 || x < 0 && y > 0
- then 78
- else 5
+Join points always have at least one value argument,
+for several reasons
+
+* If we try to lift a primitive-typed something out
+ for let-binding-purposes, we will *caseify* it (!),
+ with potentially-disastrous strictness results. So
+ instead we turn it into a function: \v -> e
+ where v::State# RealWorld#. The value passed to this function
+ is realworld#, which generates (almost) no code.
+
+* CPR. We used to say "&& isUnLiftedType rhs_ty'" here, but now
+ we make the join point into a function whenever used_bndrs'
+ is empty. This makes the join-point more CPR friendly.
+ Consider: let j = if .. then I# 3 else I# 4
+ in case .. of { A -> j; B -> j; C -> ... }
+
+ Now CPR doesn't w/w j because it's a thunk, so
+ that means that the enclosing function can't w/w either,
+ which is a lose. Here's the example that happened in practice:
+ kgmod :: Int -> Int -> Int
+ kgmod x y = if x > 0 && y < 0 || x < 0 && y > 0
+ then 78
+ else 5
+
+* Let-no-escape. We want a join point to turn into a let-no-escape
+ so that it is implemented as a jump, and one of the conditions
+ for LNE is that it's not updatable. In CoreToStg, see
+ Note [What is a non-escaping let]
+
+* Floating. Since a join point will be entered once, no sharing is
+ gained by floating out, but something might be lost by doing
+ so because it might be allocated.
I have seen a case alternative like this:
True -> \v -> ...
@@ -2643,6 +2651,11 @@ It's a bit silly to add the realWorld dummy arg in this case, making
True -> $j s
(the \v alone is enough to make CPR happy) but I think it's rare
+There's a slight infelicity here: we pass the overall
+case_bndr to all the join points if it's used in *any* RHS,
+because we don't know its usage in each RHS separately
+
+
Note [Duplicating StrictArg]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The original plan had (where E is a big argument)
More information about the ghc-commits
mailing list