- = dtrace (vcat [text "vectTopRhs", ppr expr])
- $ closedV
- $ do (inline, isScalar, vexpr) <-
- inBind var $ vectPolyExpr (isLoopBreaker $ idOccInfo var) recFs (freeVars expr)
- if isScalar
- then addGlobalScalar var
- else deleteGlobalScalar var
- return (inline, isScalar, vectorised vexpr)
-
+ = closedV
+ $ do { traceVt ("vectTopRhs of " ++ show var) $ ppr expr
+
+ ; globalScalar <- isGlobalScalar var
+ ; vectDecl <- lookupVectDecl var
+ ; rhs globalScalar vectDecl
+ }
+ where
+ rhs _globalScalar (Just (_, expr')) -- Case (1)
+ = return (inlineMe, False, expr')
+ rhs True _vectDecl -- Case (2)
+ = return (inlineMe, True, scalarRHS)
+ -- FIXME: that True is not enough to register scalarness
+ rhs False _vectDecl -- Case (3)
+ = do { let fvs = freeVars expr
+ ; (inline, isScalar, vexpr) <- inBind var $
+ vectPolyExpr (isLoopBreaker $ idOccInfo var) recFs fvs
+ ; if isScalar
+ then addGlobalScalar var
+ else deleteGlobalScalar var
+ ; return (inline, isScalar, vectorised vexpr)
+ }
+
+ -- For scalar right-hand sides, we know that the original binding will remain unaltered
+ -- (hence, we can refer to it without risk of cycles) - cf, 'tryConvert'.
+ scalarRHS = panic "Vectorise.scalarRHS: not implemented yet"