44{-# HLINT ignore "Redundant lambda" #-}
55{-# HLINT ignore "Use tuple-section" #-}
66module Gibbon.Passes.OptimizeADTLayout
7- ( optimizeADTLayout ,
7+ (
88 globallyOptimizeDataConLayout ,
99 locallyOptimizeDataConLayout
1010 )
@@ -34,6 +34,7 @@ import Gibbon.Passes.AccessPatternsAnalysis
3434 ( DataConAccessMap ,
3535 FieldMap ,
3636 generateAccessGraphs ,
37+ getGreedyOrder
3738 )
3839import Gibbon.Passes.CallGraph
3940 ( ProducersMap (.. ),
@@ -66,11 +67,11 @@ import Gibbon.Passes.Flatten (flattenL1)
6667type FieldOrder = M. Map DataCon [Integer ]
6768
6869-- TODO: Make FieldOrder an argument passed to shuffleDataCon function.
69- optimizeADTLayout ::
70- Prog1 ->
71- PassM Prog1
72- optimizeADTLayout prg@ Prog {ddefs, fundefs, mainExp} =
73- do
70+ -- optimizeADTLayout ::
71+ -- Prog1 ->
72+ -- PassM Prog1
73+ -- optimizeADTLayout prg@Prog{ddefs, fundefs, mainExp} =
74+ -- do
7475 -- let list_pair_func_dcon =
7576 -- concatMap ( \fn@(FunDef {funName, funMeta = FunMeta {funOptLayout = layout}}) ->
7677 -- case layout of
@@ -124,25 +125,25 @@ optimizeADTLayout prg@Prog{ddefs, fundefs, mainExp} =
124125 -- p
125126 -- pure prg'
126127 -- prg' <- runUntilFixPoint prg
127- globallyOptimizeDataConLayout prg
128+ -- globallyOptimizeDataConLayout prg
128129 -- pure prg'
129130 -- generateCopyFunctionsForFunctionsThatUseOptimizedVariable (toVar funcName) (dcon ++ "Optimized") fieldorder prg'
130131 -- _ -> error "OptimizeFieldOrder: handle user constraints"
131132
132133
133- locallyOptimizeDataConLayout :: Prog1 -> PassM Prog1
134- locallyOptimizeDataConLayout prg1 = do
135- runUntilFixPoint prg1
134+ locallyOptimizeDataConLayout :: Bool -> Prog1 -> PassM Prog1
135+ locallyOptimizeDataConLayout useGreedy prg1 = do
136+ runUntilFixPoint useGreedy prg1
136137
137138
138139
139- runUntilFixPoint :: Prog1 -> PassM Prog1
140- runUntilFixPoint prog1 = do
141- prog1' <- producerConsumerLayoutOptimization prog1
140+ runUntilFixPoint :: Bool -> Prog1 -> PassM Prog1
141+ runUntilFixPoint useGreedy prog1 = do
142+ prog1' <- producerConsumerLayoutOptimization prog1 useGreedy
142143 prog1'' <- flattenL1 prog1'
143144 if prog1 == prog1''
144145 then return prog1
145- else runUntilFixPoint prog1''
146+ else runUntilFixPoint useGreedy prog1''
146147
147148
148149dataConsInFunBody :: Exp1 -> S. Set DataCon
@@ -172,8 +173,8 @@ dataConsInFunBody funBody = case funBody of
172173 MapE {} -> error " getGeneratedVariable: TODO MapE"
173174 FoldE {} -> error " getGeneratedVariable: TODO FoldE"
174175
175- producerConsumerLayoutOptimization :: Prog1 -> PassM Prog1
176- producerConsumerLayoutOptimization prg@ Prog {ddefs, fundefs, mainExp} = do
176+ producerConsumerLayoutOptimization :: Prog1 -> Bool -> PassM Prog1
177+ producerConsumerLayoutOptimization prg@ Prog {ddefs, fundefs, mainExp} useGreedy = do
177178 -- TODO: make a custom function name printer that guarantees that functions starting with _ are auto-generated.
178179 let funsToOptimize = P. concatMap (\ FunDef {funName} -> ([funName | not $ isInfixOf " _" (fromVar funName)])
179180 ) $ M. elems fundefs
@@ -193,7 +194,7 @@ producerConsumerLayoutOptimization prg@Prog{ddefs, fundefs, mainExp} = do
193194 Just x -> x
194195 Nothing -> error " producerConsumerLayoutOptimization: expected a function definition!!"
195196 let fieldOrder = getAccessGraph f dcon
196- let result = optimizeFunctionWRTDataCon dd fd dcon (fromVar newSymDcon) fieldOrder
197+ let result = optimizeFunctionWRTDataCon dd fd dcon (fromVar newSymDcon) fieldOrder useGreedy
197198 case result of
198199 Nothing -> pure pr -- dbgTraceIt (sdoc (result, fname, fieldOrder))
199200 Just (ddefs', fundef', fieldorder) -> let fundefs' = M. delete fname fds
@@ -207,8 +208,8 @@ producerConsumerLayoutOptimization prg@Prog{ddefs, fundefs, mainExp} = do
207208 P. foldrM lambda prg linearizeDcons -- dbgTraceIt (sdoc linearizeDcons)
208209
209210
210- globallyOptimizeDataConLayout :: Prog1 -> PassM Prog1
211- globallyOptimizeDataConLayout prg@ Prog {ddefs, fundefs, mainExp} = do
211+ globallyOptimizeDataConLayout :: Bool -> Prog1 -> PassM Prog1
212+ globallyOptimizeDataConLayout useGreedy prg@ Prog {ddefs, fundefs, mainExp} = do
212213 -- TODO: make a custom function name printer that guarantees that functions starting with _ are auto-generated.
213214 let funsToOptimize = P. concatMap (\ FunDef {funName} -> ([funName | not $ isInfixOf " _" (fromVar funName)])
214215 ) $ M. elems fundefs
@@ -261,7 +262,7 @@ globallyOptimizeDataConLayout prg@Prog{ddefs, fundefs, mainExp} = do
261262 let fd = case maybeFd of
262263 Just x -> x
263264 Nothing -> error " globallyOptimizeDataConLayout: expected a function definition!!"
264- let result = optimizeFunctionWRTDataCon dd fd dcon (fromVar newSymDcon) fieldOrder
265+ let result = optimizeFunctionWRTDataCon dd fd dcon (fromVar newSymDcon) fieldOrder useGreedy
265266 case result of
266267 Nothing -> pure pr
267268 Just (ddefs', fundef', fieldorder) -> let fundefs' = M. delete fname fds
@@ -491,12 +492,16 @@ getAccessGraph
491492
492493
493494
495+
496+ -- getGreedyFieldOrder :: Int -> DataCon -> FieldMap
497+
494498optimizeFunctionWRTDataCon ::
495499 DDefs1 ->
496500 FunDef1 ->
497501 DataCon ->
498502 DataCon ->
499503 FieldMap ->
504+ Bool ->
500505 Maybe (DDefs1 , FunDef1 , FieldOrder )
501506optimizeFunctionWRTDataCon
502507 ddefs
@@ -508,7 +513,9 @@ optimizeFunctionWRTDataCon
508513 }
509514 datacon
510515 newDcon
511- fieldMap =
516+ fieldMap
517+ useGreedy = case useGreedy of
518+ False ->
512519 let field_len = P. length $ snd . snd $ lkp' ddefs datacon
513520 fieldorder =
514521 optimizeDataConOrderFunc
@@ -531,7 +538,24 @@ optimizeFunctionWRTDataCon
531538 fundef' = shuffleDataConFunBody True fieldorder fundef newDcon
532539 in Just (newDDefs, fundef', fieldorder) -- dbgTraceIt (sdoc order) -- dbgTraceIt (sdoc fieldorder)
533540 _ -> error " more than one"
534-
541+ True ->
542+ let field_len = P. length $ snd . snd $ lkp' ddefs datacon
543+ edges' = case (M. lookup funName fieldMap) of
544+ Just d -> case (M. lookup datacon d) of
545+ Nothing -> error " "
546+ Just e -> e
547+ Nothing -> error " "
548+ greedy_order = getGreedyOrder edges' field_len
549+ fieldorder = M. insert datacon greedy_order M. empty
550+ in case M. toList fieldorder of
551+ [] -> Nothing -- dbgTraceIt (sdoc fieldorder) dbgTraceIt (sdoc greedy_order)
552+ [(dcon, order)] -> let orignal_order = [0 .. (P. length order - 1 )]
553+ in if orignal_order == P. map P. fromInteger order
554+ then Nothing
555+ else let newDDefs = optimizeDataCon (dcon, order) ddefs newDcon
556+ fundef' = shuffleDataConFunBody True fieldorder fundef newDcon
557+ in Just (newDDefs, fundef', fieldorder) -- dbgTraceIt (sdoc order) -- dbgTraceIt (sdoc fieldorder) dbgTraceIt (sdoc greedy_order)
558+ _ -> error " more than one"
535559
536560changeCallNameInRecFunction ::
537561 Var -> FunDef1 -> FunDef1
0 commit comments