Special case 'patError' in the vectoriser
authorManuel M T Chakravarty <chak@cse.unsw.edu.au>
Sun, 19 Jun 2011 01:45:31 +0000 (11:45 +1000)
committerManuel M T Chakravarty <chak@cse.unsw.edu.au>
Sun, 19 Jun 2011 02:36:44 +0000 (12:36 +1000)
compiler/vectorise/Vectorise/Exp.hs

index 4676e18..9827190 100644 (file)
@@ -62,7 +62,8 @@ vectPolyExpr loop_breaker recFns expr
     (tvs, mono) = collectAnnTypeBinders expr
 
 
--- | Vectorise an expression.
+-- |Vectorise an expression.
+--
 vectExpr :: CoreExprWithFVs -> VM VExpr
 vectExpr (_, AnnType ty)
   = liftM vType (vectType ty)
@@ -76,6 +77,17 @@ vectExpr (_, AnnLit lit)
 vectExpr (_, AnnNote note expr)
   = liftM (vNote note) (vectExpr expr)
 
+-- SPECIAL CASE: Vectorise/lift 'patError @ ty err' by only vectorising/lifting the type 'ty';
+--   its only purpose is to abort the program, but we need to adjust the type to keep CoreLint
+--   happy.
+vectExpr (_, AnnApp (_, AnnApp (_, AnnVar v) (_, AnnType ty)) err)
+  | v == pAT_ERROR_ID
+  = do { (vty, lty) <- vectAndLiftType ty
+       ; return (mkCoreApps (Var v) [Type vty, err'], mkCoreApps (Var v) [Type lty, err'])
+       }
+  where
+    err' = deAnnotate err
+
 vectExpr e@(_, AnnApp _ arg)
   | isAnnTypeArg arg
   = vectTyAppExpr fn tys