summaryrefslogtreecommitdiff
path: root/compiler/vectorise
diff options
context:
space:
mode:
authorsimonpj@microsoft.com <unknown>2009-12-02 17:42:56 +0000
committersimonpj@microsoft.com <unknown>2009-12-02 17:42:56 +0000
commitc86161c5cf11de77e911fcb9e1e2bd1f8bd80b42 (patch)
tree39f7e3d21337767e65bac94ab116dfd47a52c55c /compiler/vectorise
parentf65f61e18bb010109fd5581c44d37382b93a35b5 (diff)
downloadhaskell-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/vectorise')
-rw-r--r--compiler/vectorise/VectType.hs4
-rw-r--r--compiler/vectorise/VectUtils.hs2
-rw-r--r--compiler/vectorise/Vectorise.hs2
3 files changed, 4 insertions, 4 deletions
diff --git a/compiler/vectorise/VectType.hs b/compiler/vectorise/VectType.hs
index 6e7557e9e2..16ac82adca 100644
--- a/compiler/vectorise/VectType.hs
+++ b/compiler/vectorise/VectType.hs
@@ -789,7 +789,7 @@ vectDataConWorkers orig_tc vect_tc arr_tc
raw_worker <- cloneId mkVectOcc orig_worker (exprType body)
let vect_worker = raw_worker `setIdUnfolding`
- mkInlineRule InlSat body arity
+ mkInlineRule needSaturated body arity
defGlobalVar orig_worker vect_worker
return (vect_worker, body)
where
@@ -830,7 +830,7 @@ buildPADict vect_tc prepr_tc arr_tc repr
let body = mkLams (tvs ++ args) expr
raw_var <- newExportedVar (method_name name) (exprType body)
let var = raw_var
- `setIdUnfolding` mkInlineRule InlSat body (length args)
+ `setIdUnfolding` mkInlineRule needSaturated body (length args)
hoistBinding var body
return var
diff --git a/compiler/vectorise/VectUtils.hs b/compiler/vectorise/VectUtils.hs
index 79e0cfb842..8dccd61c24 100644
--- a/compiler/vectorise/VectUtils.hs
+++ b/compiler/vectorise/VectUtils.hs
@@ -371,7 +371,7 @@ hoistExpr fs expr inl
where
mk_inline var = case inl of
Inline arity -> var `setIdUnfolding`
- mkInlineRule InlSat expr arity
+ mkInlineRule needSaturated expr arity
DontInline -> var
hoistVExpr :: VExpr -> Inline -> VM VVar
diff --git a/compiler/vectorise/Vectorise.hs b/compiler/vectorise/Vectorise.hs
index 59fded3c4f..cc91e9fc9c 100644
--- a/compiler/vectorise/Vectorise.hs
+++ b/compiler/vectorise/Vectorise.hs
@@ -106,7 +106,7 @@ vectTopBinder var inline expr
return var'
where
unfolding = case inline of
- Inline arity -> mkInlineRule InlSat expr arity
+ Inline arity -> mkInlineRule needSaturated expr arity
DontInline -> noUnfolding
vectTopRhs :: Var -> CoreExpr -> VM (Inline, CoreExpr)