{-# LANGUAGE GADTs               #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE TypeApplications    #-}
{-# LANGUAGE TypeFamilies        #-}
{-# OPTIONS_HADDOCK hide #-}
-- |
-- Module      : Data.Array.Accelerate.LLVM.Link
-- Copyright   : [2017..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.LLVM.Link (

  Link(..),
  linkAcc, linkAfun,

  ExecOpenAcc(..), ExecOpenAfun,
  ExecAcc, ExecAfun,

) where

-- accelerate
import Data.Array.Accelerate.Representation.Array
import Data.Array.Accelerate.AST                                    ( PreOpenAfun(..), HasArraysR(..) )

import Data.Array.Accelerate.LLVM.AST
import Data.Array.Accelerate.LLVM.CodeGen.Environment
import Data.Array.Accelerate.LLVM.Compile
import Data.Array.Accelerate.LLVM.State

import Control.Applicative                                          hiding ( Const )
import Prelude                                                      hiding ( exp )


class Link arch where
  data ExecutableR arch

  -- | Link a target-specific object file into the current context to produce an
  -- executable functions.
  --
  linkForTarget
      :: ObjectR arch
      -> LLVM arch (ExecutableR arch)


-- | Annotate an open array expression with executable code loaded into the
-- target address space, suitable for execution.
--
data ExecOpenAcc arch aenv a where
  ExecAcc   :: ArraysR a
            -> Gamma aenv
            -> ExecutableR arch
            -> PreOpenAccSkeleton ExecOpenAcc arch aenv a
            -> ExecOpenAcc arch aenv a

  EvalAcc   :: ArraysR a
            -> PreOpenAccCommand  ExecOpenAcc arch aenv a
            -> ExecOpenAcc arch aenv a

instance HasArraysR (ExecOpenAcc arch) where
  {-# INLINEABLE arraysR #-}
  arraysR :: ExecOpenAcc arch aenv a -> ArraysR a
arraysR (ExecAcc ArraysR a
r Gamma aenv
_ ExecutableR arch
_ PreOpenAccSkeleton ExecOpenAcc arch aenv a
_) = ArraysR a
r
  arraysR (EvalAcc ArraysR a
r PreOpenAccCommand ExecOpenAcc arch aenv a
_)     = ArraysR a
r

-- An AST annotated with compiled and linked functions in the target address
-- space, suitable for execution.
--
type ExecOpenAfun arch  = PreOpenAfun (ExecOpenAcc arch)

type ExecAcc arch a     = ExecOpenAcc arch () a
type ExecAfun arch a    = ExecOpenAfun arch () a


-- | Link the compiled code for an array expression into the target address
-- space. Additionally, copy input array data into the target address space.
--
{-# INLINEABLE linkAcc #-}
linkAcc
    :: Link arch
    => CompiledAcc arch a
    -> LLVM arch (ExecAcc arch a)
linkAcc :: CompiledAcc arch a -> LLVM arch (ExecAcc arch a)
linkAcc = CompiledAcc arch a -> LLVM arch (ExecAcc arch a)
forall arch _aenv _a.
Link arch =>
CompiledOpenAcc arch _aenv _a
-> LLVM arch (ExecOpenAcc arch _aenv _a)
linkOpenAcc

{-# INLINEABLE linkAfun #-}
linkAfun
    :: Link arch
    => CompiledAfun arch f
    -> LLVM arch (ExecAfun arch f)
linkAfun :: CompiledAfun arch f -> LLVM arch (ExecAfun arch f)
linkAfun = CompiledAfun arch f -> LLVM arch (ExecAfun arch f)
forall arch aenv f.
Link arch =>
CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
linkOpenAfun


{-# INLINEABLE linkOpenAfun #-}
linkOpenAfun
    :: Link arch
    => CompiledOpenAfun arch aenv f
    -> LLVM arch (ExecOpenAfun arch aenv f)
linkOpenAfun :: CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
linkOpenAfun (Alam ALeftHandSide a aenv aenv'
lhs PreOpenAfun (CompiledOpenAcc arch) aenv' t1
l) = ALeftHandSide a aenv aenv'
-> PreOpenAfun (ExecOpenAcc arch) aenv' t1
-> PreOpenAfun (ExecOpenAcc arch) aenv (a -> t1)
forall a aenv aenv' (acc :: * -> * -> *) t1.
ALeftHandSide a aenv aenv'
-> PreOpenAfun acc aenv' t1 -> PreOpenAfun acc aenv (a -> t1)
Alam ALeftHandSide a aenv aenv'
lhs (PreOpenAfun (ExecOpenAcc arch) aenv' t1
 -> PreOpenAfun (ExecOpenAcc arch) aenv (a -> t1))
-> LLVM arch (PreOpenAfun (ExecOpenAcc arch) aenv' t1)
-> LLVM arch (PreOpenAfun (ExecOpenAcc arch) aenv (a -> t1))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PreOpenAfun (CompiledOpenAcc arch) aenv' t1
-> LLVM arch (PreOpenAfun (ExecOpenAcc arch) aenv' t1)
forall arch aenv f.
Link arch =>
CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
linkOpenAfun PreOpenAfun (CompiledOpenAcc arch) aenv' t1
l
linkOpenAfun (Abody CompiledOpenAcc arch aenv f
b)    = ExecOpenAcc arch aenv f -> ExecOpenAfun arch aenv f
forall (acc :: * -> * -> *) aenv t.
acc aenv t -> PreOpenAfun acc aenv t
Abody    (ExecOpenAcc arch aenv f -> ExecOpenAfun arch aenv f)
-> LLVM arch (ExecOpenAcc arch aenv f)
-> LLVM arch (ExecOpenAfun arch aenv f)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv f -> LLVM arch (ExecOpenAcc arch aenv f)
forall arch _aenv _a.
Link arch =>
CompiledOpenAcc arch _aenv _a
-> LLVM arch (ExecOpenAcc arch _aenv _a)
linkOpenAcc CompiledOpenAcc arch aenv f
b

{-# INLINEABLE linkOpenAcc #-}
linkOpenAcc
    :: forall arch _aenv _a. Link arch
    => CompiledOpenAcc arch _aenv _a
    -> LLVM arch (ExecOpenAcc arch _aenv _a)
linkOpenAcc :: CompiledOpenAcc arch _aenv _a
-> LLVM arch (ExecOpenAcc arch _aenv _a)
linkOpenAcc = CompiledOpenAcc arch _aenv _a
-> LLVM arch (ExecOpenAcc arch _aenv _a)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA
  where
    travA :: forall aenv arrs. CompiledOpenAcc arch aenv arrs -> LLVM arch (ExecOpenAcc arch aenv arrs)
    travA :: CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA (PlainAcc ArraysR arrs
repr' PreOpenAccCommand CompiledOpenAcc arch aenv arrs
pacc) = ArraysR arrs
-> PreOpenAccCommand ExecOpenAcc arch aenv arrs
-> ExecOpenAcc arch aenv arrs
forall a arch aenv.
ArraysR a
-> PreOpenAccCommand ExecOpenAcc arch aenv a
-> ExecOpenAcc arch aenv a
EvalAcc ArraysR arrs
repr' (PreOpenAccCommand ExecOpenAcc arch aenv arrs
 -> ExecOpenAcc arch aenv arrs)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
      case PreOpenAccCommand CompiledOpenAcc arch aenv arrs
pacc of
        Unzip UnzipIdx tup e
tix ArrayVar aenv (Array sh tup)
ix            -> PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e))
forall (m :: * -> *) a. Monad m => a -> m a
return (UnzipIdx tup e
-> ArrayVar aenv (Array sh tup)
-> PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
forall tup e aenv sh (acc :: * -> * -> * -> *) arch.
UnzipIdx tup e
-> ArrayVar aenv (Array sh tup)
-> PreOpenAccCommand acc arch aenv (Array sh e)
Unzip UnzipIdx tup e
tix ArrayVar aenv (Array sh tup)
ix)
        Avar ArrayVar aenv arrs
ix                 -> PreOpenAccCommand ExecOpenAcc arch aenv arrs
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (m :: * -> *) a. Monad m => a -> m a
return (ArrayVar aenv arrs -> PreOpenAccCommand ExecOpenAcc arch aenv arrs
forall aenv arrs (acc :: * -> * -> * -> *) arch.
ArrayVar aenv arrs -> PreOpenAccCommand acc arch aenv arrs
Avar ArrayVar aenv arrs
ix)
        Use ArrayR (Array sh e)
repr Array sh e
arr            -> ArrayR (Array sh e) -> Array sh e -> ()
forall a. ArrayR a -> a -> ()
rnfArray ArrayR (Array sh e)
repr Array sh e
arr ()
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e))
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e))
`seq` PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e))
forall (m :: * -> *) a. Monad m => a -> m a
return (ArrayR (Array sh e)
-> Array sh e
-> PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
forall sh e (acc :: * -> * -> * -> *) arch aenv.
ArrayR (Array sh e)
-> Array sh e -> PreOpenAccCommand acc arch aenv (Array sh e)
Use ArrayR (Array sh e)
repr Array sh e
arr)
        Unit TypeR e
tp Exp aenv e
e               -> PreOpenAccCommand ExecOpenAcc arch aenv (Scalar e)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Scalar e))
forall (m :: * -> *) a. Monad m => a -> m a
return (PreOpenAccCommand ExecOpenAcc arch aenv (Scalar e)
 -> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Scalar e)))
-> PreOpenAccCommand ExecOpenAcc arch aenv (Scalar e)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Scalar e))
forall a b. (a -> b) -> a -> b
$ TypeR e
-> Exp aenv e -> PreOpenAccCommand ExecOpenAcc arch aenv (Scalar e)
forall e aenv (acc :: * -> * -> * -> *) arch.
TypeR e -> Exp aenv e -> PreOpenAccCommand acc arch aenv (Scalar e)
Unit TypeR e
tp Exp aenv e
e
        Alloc ArrayR (Array sh e)
repr Exp aenv sh
sh           -> PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e))
forall (m :: * -> *) a. Monad m => a -> m a
return (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
 -> LLVM
      arch (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)))
-> PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e))
forall a b. (a -> b) -> a -> b
$ ArrayR (Array sh e)
-> Exp aenv sh
-> PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
forall sh e aenv (acc :: * -> * -> * -> *) arch.
ArrayR (Array sh e)
-> Exp aenv sh -> PreOpenAccCommand acc arch aenv (Array sh e)
Alloc ArrayR (Array sh e)
repr Exp aenv sh
sh
        Alet ALeftHandSide bnd aenv aenv'
lhs CompiledOpenAcc arch aenv bnd
a CompiledOpenAcc arch aenv' arrs
b            -> ALeftHandSide bnd aenv aenv'
-> ExecOpenAcc arch aenv bnd
-> ExecOpenAcc arch aenv' arrs
-> PreOpenAccCommand ExecOpenAcc arch aenv arrs
forall bnd aenv aenv' (acc :: * -> * -> * -> *) arch body.
ALeftHandSide bnd aenv aenv'
-> acc arch aenv bnd
-> acc arch aenv' body
-> PreOpenAccCommand acc arch aenv body
Alet ALeftHandSide bnd aenv aenv'
lhs        (ExecOpenAcc arch aenv bnd
 -> ExecOpenAcc arch aenv' arrs
 -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv bnd)
-> LLVM
     arch
     (ExecOpenAcc arch aenv' arrs
      -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv bnd
-> LLVM arch (ExecOpenAcc arch aenv bnd)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv bnd
a  LLVM
  arch
  (ExecOpenAcc arch aenv' arrs
   -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv' arrs)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> CompiledOpenAcc arch aenv' arrs
-> LLVM arch (ExecOpenAcc arch aenv' arrs)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv' arrs
b
        Apply ArraysR arrs
repr PreOpenAfun (CompiledOpenAcc arch) aenv (as -> arrs)
f CompiledOpenAcc arch aenv as
a          -> ArraysR arrs
-> PreOpenAfun (ExecOpenAcc arch) aenv (as -> arrs)
-> ExecOpenAcc arch aenv as
-> PreOpenAccCommand ExecOpenAcc arch aenv arrs
forall bs (acc :: * -> * -> * -> *) arch aenv as.
ArraysR bs
-> PreOpenAfun (acc arch) aenv (as -> bs)
-> acc arch aenv as
-> PreOpenAccCommand acc arch aenv bs
Apply ArraysR arrs
repr      (PreOpenAfun (ExecOpenAcc arch) aenv (as -> arrs)
 -> ExecOpenAcc arch aenv as
 -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (PreOpenAfun (ExecOpenAcc arch) aenv (as -> arrs))
-> LLVM
     arch
     (ExecOpenAcc arch aenv as
      -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PreOpenAfun (CompiledOpenAcc arch) aenv (as -> arrs)
-> LLVM arch (PreOpenAfun (ExecOpenAcc arch) aenv (as -> arrs))
forall aenv f.
CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
travAF PreOpenAfun (CompiledOpenAcc arch) aenv (as -> arrs)
f LLVM
  arch
  (ExecOpenAcc arch aenv as
   -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv as)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> CompiledOpenAcc arch aenv as
-> LLVM arch (ExecOpenAcc arch aenv as)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv as
a
        Awhile PreOpenAfun (CompiledOpenAcc arch) aenv (arrs -> Scalar PrimBool)
p PreOpenAfun (CompiledOpenAcc arch) aenv (arrs -> arrs)
f CompiledOpenAcc arch aenv arrs
a            -> PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> Scalar PrimBool)
-> PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> arrs)
-> ExecOpenAcc arch aenv arrs
-> PreOpenAccCommand ExecOpenAcc arch aenv arrs
forall (acc :: * -> * -> * -> *) arch aenv arrs.
PreOpenAfun (acc arch) aenv (arrs -> Scalar PrimBool)
-> PreOpenAfun (acc arch) aenv (arrs -> arrs)
-> acc arch aenv arrs
-> PreOpenAccCommand acc arch aenv arrs
Awhile          (PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> Scalar PrimBool)
 -> PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> arrs)
 -> ExecOpenAcc arch aenv arrs
 -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM
     arch
     (PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> Scalar PrimBool))
-> LLVM
     arch
     (PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> arrs)
      -> ExecOpenAcc arch aenv arrs
      -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> PreOpenAfun (CompiledOpenAcc arch) aenv (arrs -> Scalar PrimBool)
-> LLVM
     arch
     (PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> Scalar PrimBool))
forall aenv f.
CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
travAF PreOpenAfun (CompiledOpenAcc arch) aenv (arrs -> Scalar PrimBool)
p LLVM
  arch
  (PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> arrs)
   -> ExecOpenAcc arch aenv arrs
   -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> arrs))
-> LLVM
     arch
     (ExecOpenAcc arch aenv arrs
      -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> PreOpenAfun (CompiledOpenAcc arch) aenv (arrs -> arrs)
-> LLVM arch (PreOpenAfun (ExecOpenAcc arch) aenv (arrs -> arrs))
forall aenv f.
CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
travAF PreOpenAfun (CompiledOpenAcc arch) aenv (arrs -> arrs)
f LLVM
  arch
  (ExecOpenAcc arch aenv arrs
   -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv arrs)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv arrs
a
        Acond Exp aenv PrimBool
p CompiledOpenAcc arch aenv arrs
t CompiledOpenAcc arch aenv arrs
e             -> Exp aenv PrimBool
-> ExecOpenAcc arch aenv arrs
-> ExecOpenAcc arch aenv arrs
-> PreOpenAccCommand ExecOpenAcc arch aenv arrs
forall aenv (acc :: * -> * -> * -> *) arch arrs.
Exp aenv PrimBool
-> acc arch aenv arrs
-> acc arch aenv arrs
-> PreOpenAccCommand acc arch aenv arrs
Acond Exp aenv PrimBool
p         (ExecOpenAcc arch aenv arrs
 -> ExecOpenAcc arch aenv arrs
 -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv arrs)
-> LLVM
     arch
     (ExecOpenAcc arch aenv arrs
      -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv arrs
t  LLVM
  arch
  (ExecOpenAcc arch aenv arrs
   -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv arrs)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv arrs
e
        Apair CompiledOpenAcc arch aenv arrs1
a1 CompiledOpenAcc arch aenv arrs2
a2             -> ExecOpenAcc arch aenv arrs1
-> ExecOpenAcc arch aenv arrs2
-> PreOpenAccCommand ExecOpenAcc arch aenv (arrs1, arrs2)
forall (acc :: * -> * -> * -> *) arch aenv arrs1 arrs2.
acc arch aenv arrs1
-> acc arch aenv arrs2
-> PreOpenAccCommand acc arch aenv (arrs1, arrs2)
Apair           (ExecOpenAcc arch aenv arrs1
 -> ExecOpenAcc arch aenv arrs2
 -> PreOpenAccCommand ExecOpenAcc arch aenv (arrs1, arrs2))
-> LLVM arch (ExecOpenAcc arch aenv arrs1)
-> LLVM
     arch
     (ExecOpenAcc arch aenv arrs2
      -> PreOpenAccCommand ExecOpenAcc arch aenv (arrs1, arrs2))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv arrs1
-> LLVM arch (ExecOpenAcc arch aenv arrs1)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv arrs1
a1 LLVM
  arch
  (ExecOpenAcc arch aenv arrs2
   -> PreOpenAccCommand ExecOpenAcc arch aenv (arrs1, arrs2))
-> LLVM arch (ExecOpenAcc arch aenv arrs2)
-> LLVM
     arch (PreOpenAccCommand ExecOpenAcc arch aenv (arrs1, arrs2))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> CompiledOpenAcc arch aenv arrs2
-> LLVM arch (ExecOpenAcc arch aenv arrs2)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv arrs2
a2
        PreOpenAccCommand CompiledOpenAcc arch aenv arrs
Anil                    -> PreOpenAccCommand ExecOpenAcc arch aenv ()
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv ())
forall (m :: * -> *) a. Monad m => a -> m a
return PreOpenAccCommand ExecOpenAcc arch aenv ()
forall (acc :: * -> * -> * -> *) arch aenv.
PreOpenAccCommand acc arch aenv ()
Anil
        Reshape ShapeR sh
shr Exp aenv sh
s ArrayVar aenv (Array sh' e)
ix        -> ShapeR sh
-> Exp aenv sh
-> ArrayVar aenv (Array sh' e)
-> PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e)
forall sh aenv sh' e (acc :: * -> * -> * -> *) arch.
ShapeR sh
-> Exp aenv sh
-> ArrayVar aenv (Array sh' e)
-> PreOpenAccCommand acc arch aenv (Array sh e)
Reshape ShapeR sh
shr Exp aenv sh
s   (ArrayVar aenv (Array sh' e)
 -> PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e))
-> LLVM arch (ArrayVar aenv (Array sh' e))
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv (Array sh e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ArrayVar aenv (Array sh' e)
-> LLVM arch (ArrayVar aenv (Array sh' e))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ArrayVar aenv (Array sh' e)
ix
        Aforeign ArraysR arrs
s String
r as -> Par arch (FutureR arch arrs)
f CompiledOpenAcc arch aenv as
a        -> ArraysR arrs
-> String
-> (as -> Par arch (FutureR arch arrs))
-> ExecOpenAcc arch aenv as
-> PreOpenAccCommand ExecOpenAcc arch aenv arrs
forall bs as arch (acc :: * -> * -> * -> *) aenv.
ArraysR bs
-> String
-> (as -> Par arch (FutureR arch bs))
-> acc arch aenv as
-> PreOpenAccCommand acc arch aenv bs
Aforeign ArraysR arrs
s String
r as -> Par arch (FutureR arch arrs)
f  (ExecOpenAcc arch aenv as
 -> PreOpenAccCommand ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv as)
-> LLVM arch (PreOpenAccCommand ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv as
-> LLVM arch (ExecOpenAcc arch aenv as)
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv as
a

    travA (BuildAcc ArraysR arrs
repr' Gamma aenv
aenv ObjectR arch
obj PreOpenAccSkeleton CompiledOpenAcc arch aenv arrs
pacc) = ArraysR arrs
-> Gamma aenv
-> ExecutableR arch
-> PreOpenAccSkeleton ExecOpenAcc arch aenv arrs
-> ExecOpenAcc arch aenv arrs
forall a aenv arch.
ArraysR a
-> Gamma aenv
-> ExecutableR arch
-> PreOpenAccSkeleton ExecOpenAcc arch aenv a
-> ExecOpenAcc arch aenv a
ExecAcc ArraysR arrs
repr' Gamma aenv
aenv  (ExecutableR arch
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv arrs
 -> ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecutableR arch)
-> LLVM
     arch
     (PreOpenAccSkeleton ExecOpenAcc arch aenv arrs
      -> ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ObjectR arch -> LLVM arch (ExecutableR arch)
forall arch.
Link arch =>
ObjectR arch -> LLVM arch (ExecutableR arch)
linkForTarget ObjectR arch
obj LLVM
  arch
  (PreOpenAccSkeleton ExecOpenAcc arch aenv arrs
   -> ExecOpenAcc arch aenv arrs)
-> LLVM arch (PreOpenAccSkeleton ExecOpenAcc arch aenv arrs)
-> LLVM arch (ExecOpenAcc arch aenv arrs)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
      case PreOpenAccSkeleton CompiledOpenAcc arch aenv arrs
pacc of
        Map TypeR b
tp CompiledOpenAcc arch aenv (Array sh a)
a                -> TypeR b
-> ExecOpenAcc arch aenv (Array sh a)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh b)
forall b (acc :: * -> * -> * -> *) arch aenv sh a.
TypeR b
-> acc arch aenv (Array sh a)
-> PreOpenAccSkeleton acc arch aenv (Array sh b)
Map TypeR b
tp          (ExecOpenAcc arch aenv (Array sh a)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh b))
-> LLVM arch (ExecOpenAcc arch aenv (Array sh a))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv (Array sh a)
-> LLVM arch (ExecOpenAcc arch aenv (Array sh a))
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv (Array sh a)
a
        Generate ArrayR (Array sh e)
repr Exp aenv sh
sh        -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e)
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e))
forall (m :: * -> *) a. Monad m => a -> m a
return (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e)
 -> LLVM
      arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e)))
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e)
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e))
forall a b. (a -> b) -> a -> b
$ ArrayR (Array sh e)
-> Exp aenv sh
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e)
forall sh e aenv (acc :: * -> * -> * -> *) arch.
ArrayR (Array sh e)
-> Exp aenv sh -> PreOpenAccSkeleton acc arch aenv (Array sh e)
Generate ArrayR (Array sh e)
repr Exp aenv sh
sh
        Transform ArrayR (Array sh' b)
repr Exp aenv sh'
sh CompiledOpenAcc arch aenv (Array sh a)
a     -> ArrayR (Array sh' b)
-> Exp aenv sh'
-> ExecOpenAcc arch aenv (Array sh a)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' b)
forall sh' b aenv (acc :: * -> * -> * -> *) arch sh' a.
ArrayR (Array sh' b)
-> Exp aenv sh'
-> acc arch aenv (Array sh' a)
-> PreOpenAccSkeleton acc arch aenv (Array sh' b)
Transform ArrayR (Array sh' b)
repr Exp aenv sh'
sh (ExecOpenAcc arch aenv (Array sh a)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' b))
-> LLVM arch (ExecOpenAcc arch aenv (Array sh a))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv (Array sh a)
-> LLVM arch (ExecOpenAcc arch aenv (Array sh a))
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv (Array sh a)
a
        Backpermute ShapeR sh'
shr Exp aenv sh'
sh CompiledOpenAcc arch aenv (Array sh e)
a    -> ShapeR sh'
-> Exp aenv sh'
-> ExecOpenAcc arch aenv (Array sh e)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' e)
forall sh' aenv (acc :: * -> * -> * -> *) arch sh e.
ShapeR sh'
-> Exp aenv sh'
-> acc arch aenv (Array sh e)
-> PreOpenAccSkeleton acc arch aenv (Array sh' e)
Backpermute ShapeR sh'
shr Exp aenv sh'
sh (ExecOpenAcc arch aenv (Array sh e)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' e))
-> LLVM arch (ExecOpenAcc arch aenv (Array sh e))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv (Array sh e)
-> LLVM arch (ExecOpenAcc arch aenv (Array sh e))
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv (Array sh e)
a
        Fold HasInitialValue
z DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
a                -> HasInitialValue
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e)
forall (acc :: * -> * -> * -> *) arch aenv sh i.
HasInitialValue
-> DelayedOpenAcc acc arch aenv (Array (sh, Int) i)
-> PreOpenAccSkeleton acc arch aenv (Array sh i)
Fold HasInitialValue
z          (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e))
-> LLVM
     arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
-> LLVM
     arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
a
        FoldSeg IntegralType i
i HasInitialValue
z DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
a DelayedOpenAcc CompiledOpenAcc arch aenv (Segments i)
s         -> IntegralType i
-> HasInitialValue
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e)
-> DelayedOpenAcc ExecOpenAcc arch aenv (Segments i)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array (sh, Int) e)
forall i (acc :: * -> * -> * -> *) arch aenv sh e.
IntegralType i
-> HasInitialValue
-> DelayedOpenAcc acc arch aenv (Array (sh, Int) e)
-> DelayedOpenAcc acc arch aenv (Segments i)
-> PreOpenAccSkeleton acc arch aenv (Array (sh, Int) e)
FoldSeg IntegralType i
i HasInitialValue
z     (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e)
 -> DelayedOpenAcc ExecOpenAcc arch aenv (Segments i)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array (sh, Int) e))
-> LLVM
     arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e))
-> LLVM
     arch
     (DelayedOpenAcc ExecOpenAcc arch aenv (Segments i)
      -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array (sh, Int) e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
-> LLVM
     arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
a LLVM
  arch
  (DelayedOpenAcc ExecOpenAcc arch aenv (Segments i)
   -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array (sh, Int) e))
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Segments i))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array (sh, Int) e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> DelayedOpenAcc CompiledOpenAcc arch aenv (Segments i)
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Segments i))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Segments i)
s
        Scan Direction
d HasInitialValue
z DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
a              -> Direction
-> HasInitialValue
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array (sh, Int) e)
forall (acc :: * -> * -> * -> *) arch aenv sh e.
Direction
-> HasInitialValue
-> DelayedOpenAcc acc arch aenv (Array (sh, Int) e)
-> PreOpenAccSkeleton acc arch aenv (Array (sh, Int) e)
Scan Direction
d HasInitialValue
z        (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array (sh, Int) e))
-> LLVM
     arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array (sh, Int) e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
-> LLVM
     arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
a
        Scan' Direction
d DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
a               -> Direction
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e)
-> PreOpenAccSkeleton
     ExecOpenAcc arch aenv (Array (sh, Int) e, Array sh e)
forall (acc :: * -> * -> * -> *) arch aenv sh e.
Direction
-> DelayedOpenAcc acc arch aenv (Array (sh, Int) e)
-> PreOpenAccSkeleton acc arch aenv (Array (sh, Int) e, Array sh e)
Scan' Direction
d         (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e)
 -> PreOpenAccSkeleton
      ExecOpenAcc arch aenv (Array (sh, Int) e, Array sh e))
-> LLVM
     arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e))
-> LLVM
     arch
     (PreOpenAccSkeleton
        ExecOpenAcc arch aenv (Array (sh, Int) e, Array sh e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
-> LLVM
     arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array (sh, Int) e))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Array (sh, Int) e)
a
        Permute CompiledOpenAcc arch aenv (Array sh' e)
d DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh e)
a             -> ExecOpenAcc arch aenv (Array sh' e)
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' e)
forall (acc :: * -> * -> * -> *) arch aenv sh' e sh.
acc arch aenv (Array sh' e)
-> DelayedOpenAcc acc arch aenv (Array sh e)
-> PreOpenAccSkeleton acc arch aenv (Array sh' e)
Permute         (ExecOpenAcc arch aenv (Array sh' e)
 -> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' e))
-> LLVM arch (ExecOpenAcc arch aenv (Array sh' e))
-> LLVM
     arch
     (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
      -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv (Array sh' e)
-> LLVM arch (ExecOpenAcc arch aenv (Array sh' e))
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv (Array sh' e)
d LLVM
  arch
  (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
   -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' e))
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh' e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh e)
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh e)
a
        Stencil1 TypeR b
tp sh
h DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh a)
a         -> TypeR b
-> sh
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh a)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh b)
forall b sh (acc :: * -> * -> * -> *) arch aenv a.
TypeR b
-> sh
-> DelayedOpenAcc acc arch aenv (Array sh a)
-> PreOpenAccSkeleton acc arch aenv (Array sh b)
Stencil1 TypeR b
tp sh
h   (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh a)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh b))
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh a))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh a)
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh a))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh a)
a
        Stencil2 TypeR c
tp sh
h DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh a)
a DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh b)
b       -> TypeR c
-> sh
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh a)
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh b)
-> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh c)
forall c sh (acc :: * -> * -> * -> *) arch aenv a b.
TypeR c
-> sh
-> DelayedOpenAcc acc arch aenv (Array sh a)
-> DelayedOpenAcc acc arch aenv (Array sh b)
-> PreOpenAccSkeleton acc arch aenv (Array sh c)
Stencil2 TypeR c
tp sh
h   (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh a)
 -> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh b)
 -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh c))
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh a))
-> LLVM
     arch
     (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh b)
      -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh c))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh a)
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh a))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh a)
a LLVM
  arch
  (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh b)
   -> PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh c))
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh b))
-> LLVM
     arch (PreOpenAccSkeleton ExecOpenAcc arch aenv (Array sh c))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh b)
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh b))
forall aenv a.
DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD DelayedOpenAcc CompiledOpenAcc arch aenv (Array sh b)
b

    travAF :: CompiledOpenAfun arch aenv f
           -> LLVM arch (ExecOpenAfun arch aenv f)
    travAF :: CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
travAF = CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
forall arch aenv f.
Link arch =>
CompiledOpenAfun arch aenv f
-> LLVM arch (ExecOpenAfun arch aenv f)
linkOpenAfun

    travD :: DelayedOpenAcc CompiledOpenAcc  arch aenv a
          -> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
    travD :: DelayedOpenAcc CompiledOpenAcc arch aenv a
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv a)
travD (Manifest ArraysR (Array sh e)
r CompiledOpenAcc arch aenv (Array sh e)
a) = ArraysR (Array sh e)
-> ExecOpenAcc arch aenv (Array sh e)
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
forall sh e (acc :: * -> * -> * -> *) arch aenv.
ArraysR (Array sh e)
-> acc arch aenv (Array sh e)
-> DelayedOpenAcc acc arch aenv (Array sh e)
Manifest ArraysR (Array sh e)
r (ExecOpenAcc arch aenv (Array sh e)
 -> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e))
-> LLVM arch (ExecOpenAcc arch aenv (Array sh e))
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CompiledOpenAcc arch aenv (Array sh e)
-> LLVM arch (ExecOpenAcc arch aenv (Array sh e))
forall aenv arrs.
CompiledOpenAcc arch aenv arrs
-> LLVM arch (ExecOpenAcc arch aenv arrs)
travA CompiledOpenAcc arch aenv (Array sh e)
a
    travD (Delayed ArrayR (Array sh e)
r Exp aenv sh
sh) = DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e))
forall (m :: * -> *) a. Monad m => a -> m a
return (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
 -> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)))
-> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
-> LLVM arch (DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e))
forall a b. (a -> b) -> a -> b
$ ArrayR (Array sh e)
-> Exp aenv sh -> DelayedOpenAcc ExecOpenAcc arch aenv (Array sh e)
forall sh e aenv (acc :: * -> * -> * -> *) arch.
ArrayR (Array sh e)
-> Exp aenv sh -> DelayedOpenAcc acc arch aenv (Array sh e)
Delayed ArrayR (Array sh e)
r Exp aenv sh
sh