Added a pass to pull up values used as initialisers in mobile allocations

This commit is contained in:
Neil Brown 2009-04-09 17:08:27 +00:00
parent 794e9ba8df
commit a400b3e4f6

View File

@ -47,6 +47,7 @@ backendPasses =
, simplifySlices
, declareSizesArray
, fixMinInt
, pullAllocMobile
-- This is not needed unless forking:
-- , mobileReturn
]
@ -94,6 +95,39 @@ removeUnneededDirections
_ -> diePC m $ formatCode "Direction applied to non-channel type: %" t
doVariable v = return v
-- | Pulls up any initialisers for mobile allocations. I think, after all the
-- other passes have run, the only place these initialisers should be left is in
-- assignments (and maybe not even those?) and A.Is items.
pullAllocMobile :: Pass
pullAllocMobile = cOnlyPass "Pull up mobile initialisers" [] []
recurse
where
ops = baseOp `extOpS` doStructured `extOp` doProcess
recurse, descend :: Data a => Transform a
recurse = makeRecurse ops
descend = makeDescend ops
doProcess :: Transform A.Process
doProcess (A.Assign m [v] (A.ExpressionList me [A.AllocMobile ma t (Just e)]))
= return $ A.Seq m $ A.Several m $ map (A.Only m) $
[A.Assign m [v] $ A.ExpressionList me [A.AllocMobile ma t Nothing]
,A.Assign m [A.DerefVariable m v] $ A.ExpressionList me [e]
]
doProcess p = descend p
doStructured :: Data a => Transform (A.Structured a)
doStructured (A.Spec mspec (A.Specification mif n
(A.Is mis am t (A.ActualExpression (A.AllocMobile ma tm (Just e)))))
body)
= do body' <- recurse body
return $ A.Spec mspec (A.Specification mif n $
A.Is mis am t $ A.ActualExpression $ A.AllocMobile ma tm Nothing)
$ A.ProcThen ma
(A.Assign ma [A.DerefVariable mif $ A.Variable mif n] $ A.ExpressionList ma [e])
body'
doStructured s = descend s
-- | Turns any literals equivalent to a MOSTNEG back into a MOSTNEG
-- The reason for doing this is that C (and presumably C++) don't technically (according
-- to the standard) allow you to write INT_MIN directly as a constant. GCC certainly