Skip to content

Commit d3f583a

Browse files
committed
add region to type env
1 parent 0c23a99 commit d3f583a

File tree

1 file changed

+63
-3
lines changed

1 file changed

+63
-3
lines changed

gibbon-compiler/src/Gibbon/Passes/Cursorize.hs

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,37 @@ cursorizeExp freeVarToVarEnv lenv ddfs fundefs denv tenv senv ex =
745745
-- Exactly same as cursorizePackedExp
746746
LetRegionE reg sz _ bod -> do
747747
(region_lets, freeVarToVarEnv') <- regionToBinds freeVarToVarEnv False reg sz
748-
mkLets (region_lets) <$> cursorizeExp freeVarToVarEnv' lenv ddfs fundefs denv tenv senv bod
748+
let reg_var = regionToVar reg
749+
let reg_ty = case reg_var of
750+
SingleR{} -> MkTy2 CursorTy
751+
SoARv _ flr -> MkTy2 $ CursorArrayTy (1 + length flr)
752+
753+
reg_var_name <- case (M.lookup (fromRegVarToFreeVarsTy reg_var) freeVarToVarEnv') of
754+
Just var -> return var
755+
Nothing -> do
756+
case reg_var of
757+
SingleR v -> return v
758+
SoARv{} -> do
759+
n <- gensym "region_cursor_ptr"
760+
return n
761+
762+
-- For end of the region
763+
reg_var_name_end <- case (M.lookup (fromRegVarToFreeVarsTy (toEndVRegVar reg_var)) freeVarToVarEnv') of
764+
Just var -> return var
765+
Nothing -> do
766+
case reg_var of
767+
SingleR v -> return $ toEndV v
768+
SoARv{} -> do
769+
n <- gensym "region_cursor_ptr_end"
770+
return n
771+
772+
let freeVarToVarEnv'' = M.insert (fromRegVarToFreeVarsTy reg_var) reg_var_name freeVarToVarEnv'
773+
let freeVarToVarEnv''' = M.insert (fromRegVarToFreeVarsTy (toEndVRegVar reg_var)) reg_var_name_end freeVarToVarEnv''
774+
775+
776+
let tenv' = M.insert reg_var_name reg_ty tenv
777+
let tenv'' = M.insert reg_var_name_end reg_ty tenv'
778+
mkLets (region_lets) <$> cursorizeExp freeVarToVarEnv''' lenv ddfs fundefs denv tenv'' senv bod
749779

750780
LetParRegionE reg sz _ bod -> do
751781
(region_lets, freeVarToVarEnv') <- regionToBinds freeVarToVarEnv True reg sz
@@ -768,7 +798,7 @@ cursorizeExp freeVarToVarEnv lenv ddfs fundefs denv tenv senv ex =
768798
dereference_bound_var <- gensym "deref"
769799
let bnd = [(dereference_bound_var, [], CursorTy, Ext $ DerefMutCursor bound_var)]
770800
pure (bnd, dereference_bound_var)
771-
Nothing -> error "expected variable to have type!"
801+
Nothing -> error $ "expected variable to have type!: " ++ show bound_var
772802
_ -> pure ([], bound_var)
773803
let cur_loc = toLocVar cur
774804
let cur_var = case (M.lookup (fromLocVarToFreeVarsTy cur_loc) freeVarToVarEnv) of
@@ -1501,7 +1531,37 @@ cursorizePackedExp freeVarToVarEnv lenv ddfs fundefs denv tenv senv ex =
15011531

15021532
LetRegionE r sz _ bod -> do
15031533
(region_lets, freeVarToVarEnv') <- regionToBinds freeVarToVarEnv False r sz
1504-
onDi (mkLets (region_lets)) <$> go freeVarToVarEnv' tenv senv bod
1534+
let reg_var = regionToVar r
1535+
let reg_ty = case reg_var of
1536+
SingleR{} -> MkTy2 CursorTy
1537+
SoARv _ flr -> MkTy2 $ CursorArrayTy (1 + length flr)
1538+
1539+
reg_var_name <- case (M.lookup (fromRegVarToFreeVarsTy reg_var) freeVarToVarEnv') of
1540+
Just var -> return var
1541+
Nothing -> do
1542+
case reg_var of
1543+
SingleR v -> return v
1544+
SoARv{} -> do
1545+
n <- gensym "region_cursor_ptr"
1546+
return n
1547+
1548+
-- For end of the region
1549+
reg_var_name_end <- case (M.lookup (fromRegVarToFreeVarsTy (toEndVRegVar reg_var)) freeVarToVarEnv') of
1550+
Just var -> return var
1551+
Nothing -> do
1552+
case reg_var of
1553+
SingleR v -> return $ toEndV v
1554+
SoARv{} -> do
1555+
n <- gensym "region_cursor_ptr_end"
1556+
return n
1557+
1558+
let freeVarToVarEnv'' = M.insert (fromRegVarToFreeVarsTy reg_var) reg_var_name freeVarToVarEnv'
1559+
let freeVarToVarEnv''' = M.insert (fromRegVarToFreeVarsTy (toEndVRegVar reg_var)) reg_var_name_end freeVarToVarEnv''
1560+
1561+
1562+
let tenv' = M.insert reg_var_name reg_ty tenv
1563+
let tenv'' = M.insert reg_var_name_end reg_ty tenv'
1564+
onDi (mkLets (region_lets)) <$> go freeVarToVarEnv''' tenv'' senv bod
15051565

15061566
LetParRegionE r sz _ bod -> do
15071567
(region_lets, freeVarToVarEnv') <- regionToBinds freeVarToVarEnv True r sz

0 commit comments

Comments
 (0)