diff options
author | simonpj@microsoft.com <unknown> | 2009-12-02 17:42:56 +0000 |
---|---|---|
committer | simonpj@microsoft.com <unknown> | 2009-12-02 17:42:56 +0000 |
commit | c86161c5cf11de77e911fcb9e1e2bd1f8bd80b42 (patch) | |
tree | 39f7e3d21337767e65bac94ab116dfd47a52c55c /compiler/specialise/Specialise.lhs | |
parent | f65f61e18bb010109fd5581c44d37382b93a35b5 (diff) | |
download | haskell-c86161c5cf11de77e911fcb9e1e2bd1f8bd80b42.tar.gz |
More work on the simplifier's inlining strategies
This patch collects a small raft of related changes
* Arrange that during
(a) rule matching and
(b) uses of exprIsConApp_maybe
we "look through" unfoldings only if they are active
in the phase. Doing this for (a) required a bit of
extra plumbing in the rule matching code, but I think
it's worth it.
One wrinkle is that even if inlining is off (in the 'gentle'
phase of simplification) during rule matching we want to
"look through" things with inlinings.
See SimplUtils.activeUnfInRule.
This fixes a long-standing bug, where things that were
supposed to be (say) NOINLINE, could still be poked into
via exprIsConApp_maybe.
* In the above cases, also check for (non-rule) loop breakers;
we never look through these. This fixes a bug that could make
the simplifier diverge (and did for Roman).
Test = simplCore/should_compile/dfun-loop
* Try harder not to choose a DFun as a loop breaker. This is
just a small adjustment in the OccurAnal scoring function
* In the scoring function in OccurAnal, look at the InlineRule
unfolding (if there is one) not the actual RHS, beause the
former is what'll be inlined.
* Make the application of any function to dictionary arguments
CONLIKE. Thus (f d1 d2) is CONLIKE.
Encapsulated in CoreUtils.isExpandableApp
Reason: see Note [Expandable overloadings] in CoreUtils
* Make case expressions seem slightly smaller in CoreUnfold.
This reverses an unexpected consequences of charging for
alternatives.
Refactorings
~~~~~~~~~~~~
* Signficantly refactor the data type for Unfolding (again).
The result is much nicer.
* Add type synonym BasicTypes.CompilerPhase = Int
and use it
Many of the files touched by this patch are simply knock-on
consequences of these two refactorings.
Diffstat (limited to 'compiler/specialise/Specialise.lhs')
-rw-r--r-- | compiler/specialise/Specialise.lhs | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/compiler/specialise/Specialise.lhs b/compiler/specialise/Specialise.lhs index 6d071e22b6..d738565856 100644 --- a/compiler/specialise/Specialise.lhs +++ b/compiler/specialise/Specialise.lhs @@ -808,7 +808,7 @@ specDefn subst body_uds fn rhs -- Figure out whether the function has an INLINE pragma -- See Note [Inline specialisations] - fn_has_inline_rule :: Maybe InlSatFlag -- Derive sat-flag from existing thing + fn_has_inline_rule :: Maybe Bool -- Derive sat-flag from existing thing fn_has_inline_rule = case isInlineRule_maybe fn_unf of Just (_,sat) -> Just sat Nothing -> Nothing @@ -825,7 +825,8 @@ specDefn subst body_uds fn rhs already_covered :: [CoreExpr] -> Bool already_covered args -- Note [Specialisations already covered] - = isJust (lookupRule (const True) (substInScope subst) + = isJust (lookupRule (const True) realIdUnfolding + (substInScope subst) fn args (idCoreRules fn)) mk_ty_args :: [Maybe Type] -> [CoreExpr] |