accelerate-llvm-1.0.0.0: LLVM/AST/Type/Terminator.hs
{-# LANGUAGE GADTs #-}
{-# OPTIONS_HADDOCK hide #-}
-- |
-- Module : LLVM.AST.Type.Terminator
-- Copyright : [2015..2017] Trevor L. McDonell
-- License : BSD3
--
-- Maintainer : Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>
-- Stability : experimental
-- Portability : non-portable (GHC extensions)
--
module LLVM.AST.Type.Terminator
where
import LLVM.AST.Type.Constant
import LLVM.AST.Type.Name
import LLVM.AST.Type.Operand
-- | <http://llvm.org/docs/LangRef.html#terminators>
--
-- TLM: well, I don't think the types of these terminators make any sense. When
-- we branch, we are not propagating a particular value, just moving the
-- program counter, and anything we have declared already is available for
-- later computations. Maybe, we can make some of this explicit in the
-- @phi@ node?
--
data Terminator a where
-- <http://llvm.org/docs/LangRef.html#ret-instruction>
--
Ret :: Terminator ()
-- <http://llvm.org/docs/LangRef.html#ret-instruction>
--
RetVal :: Operand a
-> Terminator a
-- <http://llvm.org/docs/LangRef.html#br-instruction>
--
Br :: Label
-> Terminator ()
-- <http://llvm.org/docs/LangRef.html#br-instruction>
--
CondBr :: Operand Bool
-> Label
-> Label
-> Terminator ()
-- <http://llvm.org/docs/LangRef.html#switch-instruction>
--
Switch :: Operand a
-> Label
-> [(Constant a, Label)]
-> Terminator ()