Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
GHC
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Alex D
GHC
Commits
aa809668
Commit
aa809668
authored
Nov 15, 2010
by
keller@cse.unsw.edu.au
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Handling of lets, letrec and case when checking if a lambda expr needs to be vectorised
parent
bfba6cc2
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
22 additions
and
1 deletion
+22
-1
compiler/vectorise/Vectorise/Exp.hs
compiler/vectorise/Vectorise/Exp.hs
+22
-1
No files found.
compiler/vectorise/Vectorise/Exp.hs
View file @
aa809668
...
...
@@ -197,13 +197,28 @@ vectScalarLam args body
=
tycon
==
intTyCon
||
tycon
==
floatTyCon
||
tycon
==
doubleTyCon
||
tycon
==
boolTyCon
|
otherwise
=
False
is_scalar
vs
(
Var
v
)
=
v
`
elemVarSet
`
vs
is_scalar
_
e
@
(
Lit
_
)
=
is_scalar_ty
$
exprType
e
is_scalar
vs
(
App
e1
e2
)
=
is_scalar
vs
e1
&&
is_scalar
vs
e2
is_scalar
_
_
=
False
is_scalar
vs
(
Let
(
NonRec
b
letExpr
)
body
)
=
is_scalar
vs
letExpr
&&
is_scalar
(
extendVarSet
vs
b
)
body
is_scalar
vs
(
Let
(
Rec
bnds
)
body
)
=
let
vs'
=
extendVarSetList
vs
(
map
fst
bnds
)
in
all
(
is_scalar
vs'
)
(
map
snd
bnds
)
&&
is_scalar
vs'
body
is_scalar
vs
(
Case
e
eId
ty
alts
)
=
let
vs'
=
extendVarSet
vs
eId
in
is_scalar_ty
ty
&&
is_scalar
vs'
e
&&
(
all
(
is_scalar_alt
vs'
)
alts
)
is_scalar
_
e
=
False
is_scalar_alt
vs
(
_
,
bs
,
e
)
=
is_scalar
(
extendVarSetList
vs
bs
)
e
-- A scalar function has to actually compute something. Without the check,
-- we would treat (\(x :: Int) -> x) as a scalar function and lift it to
...
...
@@ -211,8 +226,14 @@ vectScalarLam args body
-- (\n# x -> x) which is what we want.
uses
funs
(
Var
v
)
=
v
`
elemVarSet
`
funs
uses
funs
(
App
e1
e2
)
=
uses
funs
e1
||
uses
funs
e2
uses
funs
(
Let
(
NonRec
b
letExpr
)
body
)
=
uses
funs
letExpr
||
uses
funs
body
uses
funs
(
Case
e
eId
ty
alts
)
=
uses
funs
e
||
any
(
uses_alt
funs
)
alts
uses
_
_
=
False
uses_alt
funs
(
_
,
bs
,
e
)
=
uses
funs
e
-- | Vectorise a lambda abstraction.
vectLam
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment