@@ -406,7 +406,26 @@ cursorizeExp ddfs fundefs denv tenv senv ex =
406
406
LetParRegionE reg sz _ bod -> do
407
407
mkLets (regionToBinds True reg sz) <$> go bod
408
408
409
- BoundsCheck i bound cur -> return $ Ext $ L3. BoundsCheck i (toLocVar bound) (toLocVar cur)
409
+ BoundsCheck i bound cur -> do
410
+ case (isMutableCursorTy bound, isMutableCursorTy cur) of
411
+ (True , True ) -> do
412
+ bound' <- gensym " newDerefBound"
413
+ cur' <- gensym " newDerefCur"
414
+ let newBoundCheckExpr = Ext $ L3. BoundsCheck i bound' cur'
415
+ exp' <- genReadMutableCursor bound newBoundCheckExpr bound'
416
+ exp'' <- genReadMutableCursor cur exp' cur'
417
+ return $ exp''
418
+ (False , True ) -> do
419
+ cur' <- gensym " newDerefCur"
420
+ let newBoundCheckExpr = Ext $ L3. BoundsCheck i (toLocVar bound) cur'
421
+ exp' <- genReadMutableCursor cur newBoundCheckExpr cur'
422
+ return $ exp'
423
+ (True , False ) -> do
424
+ bound' <- gensym " newDerefBound"
425
+ let newBoundCheckExpr = Ext $ L3. BoundsCheck i bound' (toLocVar cur)
426
+ exp' <- genReadMutableCursor bound newBoundCheckExpr bound'
427
+ return $ exp'
428
+ (False , False ) -> return $ Ext $ L3. BoundsCheck i (toLocVar bound) (toLocVar cur)
410
429
411
430
FromEndE {} -> error $ " cursorizeExp: TODO FromEndE" ++ sdoc ext
412
431
@@ -430,6 +449,24 @@ cursorizeExp ddfs fundefs denv tenv senv ex =
430
449
go = cursorizeExp ddfs fundefs denv tenv senv
431
450
432
451
452
+ -- genDerefOrVar :: LocArg -> Exp3 -> Var -> PassM (Either Var Exp3)
453
+ -- genDerefOrVar locArg bod var = case isMutableCursorTy locArg of
454
+ -- True -> genReadMutableCursor locArg bod
455
+ -- False ->
456
+
457
+ isMutableCursorTy :: LocArg -> Bool
458
+ isMutableCursorTy locArg = case locArg of
459
+ Loc LREM {lremLoc, lremReg, lremEndReg, lremMode} -> case lremMode of
460
+ OutputMutable -> True
461
+ _ -> False
462
+ _ -> False
463
+
464
+ genReadMutableCursor :: LocArg -> Exp3 -> Var -> PassM Exp3
465
+ genReadMutableCursor locArg bod newCursor = do
466
+ let derefCursorExp = Ext $ L3. DerefMutableCursor (toLocVar locArg)
467
+ return $ LetE (newCursor, [] , CursorTy , derefCursorExp) bod
468
+
469
+
433
470
-- Cursorize expressions producing `Packed` values
434
471
cursorizePackedExp :: DDefs Ty2 -> FunDefs2 -> DepEnv -> TyEnv Ty2 -> SyncEnv -> Exp2
435
472
-> PassM (DiExp Exp3 )
0 commit comments