Skip to content

Potentially turn MachOp into a GADT?

Currently MachOps are quite delicate since there is nothing tying the arity of the operation (not to mention its expected argument types) to its expression. Consequently, we have a variety of wildcard pattern matches in the C-- optimiser and NCG which mask incomplete matches which periodically blow-up (e.g. #18141 (closed)). It seems like we could easily make MachOp a GADT which would encode the (at least) arity of the operation. I can think of a number of ways to slice this. For instance, we might have,

data MachOp (arity :: Nat) where
  MO_Add :: Width -> MachOp 2
  MO_SF_Conv :: Width -> Width -> MachOp 1
  -- ...
  
type family OpArgs :: Nat -> Type
type instance OpArgs 0 = ()
type instance OpArgs 1 = CmmExpr
type instance OpArgs 2 = (CmmExpr, CmmExpr)

data CmmExpr where
  CmmMachOp :: forall arity. MachOp arity -> OpArgs arity -> CmmExpr
  -- ...

This would allow us to eliminate a partial matches associated with arity (and slightly the representation size in some cases, since we the arguments are a product rather than a cons list).

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information