Compare commits

...

1 Commits

Author SHA1 Message Date
Leonardo de Moura
03bae7b676 perf: cache visited exprs at CheckAssignmentQuick 2024-09-01 14:22:07 -07:00

View File

@@ -895,23 +895,27 @@ end CheckAssignment
namespace CheckAssignmentQuick namespace CheckAssignmentQuick
partial def check unsafe def checkImpl
(hasCtxLocals : Bool) (hasCtxLocals : Bool)
(mctx : MetavarContext) (lctx : LocalContext) (mvarDecl : MetavarDecl) (mvarId : MVarId) (fvars : Array Expr) (e : Expr) : Bool := (mctx : MetavarContext) (lctx : LocalContext) (mvarDecl : MetavarDecl) (mvarId : MVarId) (fvars : Array Expr) (e : Expr) : Bool :=
let rec visit (e : Expr) : Bool := Id.run do let rec visit (e : Expr) : StateM (PtrSet Expr) Bool := do
if !e.hasExprMVar && !e.hasFVar then if !e.hasExprMVar && !e.hasFVar then
return true return true
if ( get).contains e then
return true
modify fun visited => visited.insert e
match e with match e with
| .mdata _ b => visit b | .mdata _ b => visit b
| .proj _ _ s => visit s | .proj _ _ s => visit s
| .app f a => visit f && visit a | .app f a => visit f <&&> visit a
| .lam _ d b _ => visit d && visit b | .lam _ d b _ => visit d <&&> visit b
| .forallE _ d b _ => visit d && visit b | .forallE _ d b _ => visit d <&&> visit b
| .letE _ t v b _ => visit t && visit v && visit b | .letE _ t v b _ => visit t <&&> visit v <&&> visit b
| .bvar .. | .sort .. | .const .. | .bvar .. | .sort .. | .const ..
| .lit .. => return true | .lit .. => return true
| .fvar fvarId .. => | .fvar fvarId .. =>
if mvarDecl.lctx.contains fvarId then return true if mvarDecl.lctx.contains fvarId then
return true
if let some (LocalDecl.ldecl ..) := lctx.find? fvarId then if let some (LocalDecl.ldecl ..) := lctx.find? fvarId then
return false -- need expensive CheckAssignment.check return false -- need expensive CheckAssignment.check
if fvars.any fun x => x.fvarId! == fvarId then if fvars.any fun x => x.fvarId! == fvarId then
@@ -925,7 +929,13 @@ partial def check
if !mvarDecl'.lctx.isSubPrefixOf mvarDecl.lctx fvars then return false -- use CheckAssignment.check if !mvarDecl'.lctx.isSubPrefixOf mvarDecl.lctx fvars then return false -- use CheckAssignment.check
let none := mctx.getDelayedMVarAssignmentCore? mvarId' | return false -- use CheckAssignment.check let none := mctx.getDelayedMVarAssignmentCore? mvarId' | return false -- use CheckAssignment.check
return true return true
visit e if !e.hasExprMVar && !e.hasFVar then
true
else
visit e |>.run' mkPtrSet
def check (hasCtxLocals : Bool) (mctx : MetavarContext) (lctx : LocalContext) (mvarDecl : MetavarDecl) (mvarId : MVarId) (fvars : Array Expr) (e : Expr) : Bool :=
unsafe checkImpl hasCtxLocals mctx lctx mvarDecl mvarId fvars e
end CheckAssignmentQuick end CheckAssignmentQuick