diff options
author | Manuel M T Chakravarty <chak@cse.unsw.edu.au> | 2012-12-05 17:06:40 +1100 |
---|---|---|
committer | Manuel M T Chakravarty <chak@cse.unsw.edu.au> | 2012-12-05 17:06:40 +1100 |
commit | 895ff2133ef9dcb3db9fafdfff95ddd97752e52f (patch) | |
tree | eb9de7c33dc9b42906370c9b667245494ab876bb | |
parent | b77da25ef0d95e776a43779bbb4843eb01d33552 (diff) | |
download | haskell-895ff2133ef9dcb3db9fafdfff95ddd97752e52f.tar.gz |
Vectoriser: fix vectorisation avoidance for case expressions
-rw-r--r-- | compiler/vectorise/Vectorise/Exp.hs | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/compiler/vectorise/Vectorise/Exp.hs b/compiler/vectorise/Vectorise/Exp.hs index 88f123210b..b300335b4f 100644 --- a/compiler/vectorise/Vectorise/Exp.hs +++ b/compiler/vectorise/Vectorise/Exp.hs @@ -1031,23 +1031,20 @@ vectAvoidInfo pvs ce@(fvs, AnnCase e var ty alts) = do { ceVI <- vectAvoidInfoTypeOf ce ; eVI <- vectAvoidInfo pvs e - ; isScalarTy <- isScalar . annExprType $ e - ; altsVI <- mapM (vectAvoidInfoAlt (isVIParr eVI && not isScalarTy)) alts - ; allScalarBndrs <- anyM allScalarAltBndrs altsVI + ; altsVI <- mapM (vectAvoidInfoAlt (isVIParr eVI)) alts ; let alteVIs = [eVI | (_, _, eVI) <- altsVI] - vi | isVIParr eVI && not allScalarBndrs = VIParr - | otherwise - = foldl unlessVIParrExpr ceVI alteVIs + vi = foldl unlessVIParrExpr ceVI (eVI:alteVIs) -- NB: same effect as in the paper ; viTrace ce vi (eVI : alteVIs) ; return ((fvs, vi), AnnCase eVI var ty altsVI) } where - vectAvoidInfoAlt isScalarScrut (con, bndrs, e) = (con, bndrs,) <$> vectAvoidInfo altPvs e - where - altPvs | isScalarScrut = pvs - | otherwise = pvs `extendVarSetList` bndrs - - allScalarAltBndrs (_, bndrs, _) = allScalarVarType bndrs + vectAvoidInfoAlt scrutIsPar (con, bndrs, e) + = do + { allScalar <- allScalarVarType bndrs + ; let altPvs | scrutIsPar && not allScalar = pvs `extendVarSetList` bndrs + | otherwise = pvs + ; (con, bndrs,) <$> vectAvoidInfo altPvs e + } vectAvoidInfo pvs (fvs, AnnCast e (fvs_ann, ann)) = do |