Skip to content

Commit d9a57a9

Browse files
committed
fix: use Arg in LCNF FVarSubst rather than Expr
1 parent 77fd1ba commit d9a57a9

File tree

6 files changed

+25
-27
lines changed

6 files changed

+25
-27
lines changed

src/Lean/Compiler/LCNF/CompilerM.lean

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ it is a free variable, a type (or type former), or `lcErased`.
166166
167167
`Check.lean` contains a substitution validator.
168168
-/
169-
abbrev FVarSubst := Std.HashMap FVarId Expr
169+
abbrev FVarSubst := Std.HashMap FVarId Arg
170170

171171
/--
172172
Replace the free variables in `e` using the given substitution.
@@ -191,7 +191,9 @@ where
191191
if e.hasFVar then
192192
match e with
193193
| .fvar fvarId => match s[fvarId]? with
194-
| some e => if translator then e else go e
194+
| some (.fvar fvarId') => if translator then .fvar fvarId' else go (.fvar fvarId')
195+
| some (.type e) => if translator then e else go e
196+
| some .erased => erasedExpr
195197
| none => e
196198
| .lit .. | .const .. | .sort .. | .mvar .. | .bvar .. => e
197199
| .app f a => e.updateApp! (goApp f) (go a) |>.headBeta
@@ -230,11 +232,9 @@ private partial def normFVarImp (s : FVarSubst) (fvarId : FVarId) (translator :
230232
.fvar fvarId'
231233
else
232234
normFVarImp s fvarId' translator
233-
| some e =>
234-
if e.isErased then
235-
.erased
236-
else
237-
panic! s!"invalid LCNF substitution of free variable with expression {e}"
235+
-- Types and type formers are only preserved as hints and
236+
-- are erased in computationally relevant contexts.
237+
| some .erased | some (.type _) => .erased
238238
| none => .fvar fvarId
239239

240240
/--
@@ -247,10 +247,9 @@ private partial def normArgImp (s : FVarSubst) (arg : Arg) (translator : Bool) :
247247
| .erased => arg
248248
| .fvar fvarId =>
249249
match s[fvarId]? with
250-
| some (.fvar fvarId') =>
251-
let arg' := .fvar fvarId'
250+
| some (arg'@(.fvar _)) =>
252251
if translator then arg' else normArgImp s arg' translator
253-
| some e => if e.isErased then .erased else .type e
252+
| some (arg'@.erased) | some (arg'@(.type _)) => arg'
254253
| none => arg
255254
| .type e => arg.updateType! (normExprImp s e translator)
256255

@@ -293,19 +292,18 @@ instance (m n) [MonadLift m n] [MonadFVarSubstState m] : MonadFVarSubstState n w
293292
modifySubst f := liftM (modifySubst f : m _)
294293

295294
/--
296-
Add the entry `fvarId ↦ fvarId'` to the free variable substitution.
295+
Add the substitution `fvarId ↦ e`, `e` must be a valid LCNF `Arg`.
296+
297+
See `Check.lean` for the free variable substitution checker.
297298
-/
298-
@[inline] def addFVarSubst [MonadFVarSubstState m] (fvarId : FVarId) (fvarId' : FVarId) : m Unit :=
299-
modifySubst fun s => s.insert fvarId (.fvar fvarId')
299+
@[inline] def addSubst [MonadFVarSubstState m] (fvarId : FVarId) (arg : Arg) : m Unit :=
300+
modifySubst fun s => s.insert fvarId arg
300301

301302
/--
302-
Add the substitution `fvarId ↦ e`, `e` must be a valid LCNF argument.
303-
That is, it must be a free variable, type (or type former), or `lcErased`.
304-
305-
See `Check.lean` for the free variable substitution checker.
303+
Add the entry `fvarId ↦ fvarId'` to the free variable substitution.
306304
-/
307-
@[inline] def addSubst [MonadFVarSubstState m] (fvarId : FVarId) (e : Expr) : m Unit :=
308-
modifySubst fun s => s.insert fvarId e
305+
@[inline] def addFVarSubst [MonadFVarSubstState m] (fvarId : FVarId) (fvarId' : FVarId) : m Unit :=
306+
modifySubst fun s => s.insert fvarId (.fvar fvarId')
309307

310308
@[inline, inherit_doc normFVarImp] def normFVar [MonadFVarSubst m t] [Monad m] (fvarId : FVarId) : m NormFVarResult :=
311309
return normFVarImp (← getSubst) fvarId t

src/Lean/Compiler/LCNF/JoinPoints.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,13 +546,13 @@ where
546546
let mut newArgs := knownArgs
547547
for (param, arg) in decl.params.zip args do
548548
if let some knownVal := newArgs[param.fvarId]? then
549-
if arg.toExpr != knownVal then
549+
if arg != knownVal then
550550
newArgs := newArgs.erase param.fvarId
551551
modify fun s => { s with jpJmpArgs := s.jpJmpArgs.insert fn newArgs }
552552
else
553553
let folder := fun acc (param, arg) => do
554554
if (← allFVarM (isInJpScope fn) arg) then
555-
return acc.insert param.fvarId arg.toExpr
555+
return acc.insert param.fvarId arg
556556
else
557557
return acc
558558
let interestingArgs ← decl.params.zip args |>.foldlM (init := {}) folder

src/Lean/Compiler/LCNF/Simp/Main.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ We use this function to inline/specialize a partial application of a local funct
4646
def specializePartialApp (info : InlineCandidateInfo) : SimpM FunDecl := do
4747
let mut subst := {}
4848
for param in info.params, arg in info.args do
49-
subst := subst.insert param.fvarId arg.toExpr
49+
subst := subst.insert param.fvarId arg
5050
let mut paramsNew := #[]
5151
for param in info.params[info.args.size:] do
5252
let type ← replaceExprFVars param.type subst (translator := true)
@@ -201,7 +201,7 @@ partial def simpCasesOnCtor? (cases : Cases) : SimpM (Option Code) := do
201201
| .ctor ctorVal ctorArgs =>
202202
let fields := ctorArgs[ctorVal.numParams:]
203203
for param in params, field in fields do
204-
addSubst param.fvarId field.toExpr
204+
addSubst param.fvarId field
205205
let k ← simp k
206206
eraseParams params
207207
return k
@@ -231,7 +231,7 @@ partial def simp (code : Code) : SimpM Code := withIncRecDepth do
231231
-- and `FVarId` rather than `Arg`, and the substitution will end up
232232
-- creating a new erased let decl in that case.
233233
if decl.type.isErased && decl.value != .erased then
234-
modifySubst fun s => s.insert decl.fvarId (.const ``lcErased [])
234+
addSubst decl.fvarId .erased
235235
eraseLetDecl decl
236236
simp k
237237
else if let some decls ← ConstantFold.foldConstants decl then

src/Lean/Compiler/LCNF/Simp/SimpM.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ See comment at `updateFunDeclInfo`.
212212
def betaReduce (params : Array Param) (code : Code) (args : Array Arg) (mustInline := false) : SimpM Code := do
213213
let mut subst := {}
214214
for param in params, arg in args do
215-
subst := subst.insert param.fvarId arg.toExpr
215+
subst := subst.insert param.fvarId arg
216216
let code ← code.internalize subst
217217
updateFunDeclInfo code mustInline
218218
return code

src/Lean/Compiler/LCNF/Specialize.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ where
238238
for param in decl.params, arg in argMask do
239239
if let some arg := arg then
240240
let arg ← normArg arg
241-
modify fun s => s.insert param.fvarId arg.toExpr
241+
modify fun s => s.insert param.fvarId arg
242242
else
243243
-- Keep the parameter
244244
let param := { param with type := param.type.instantiateLevelParamsNoCache decl.levelParams us }

src/Lean/Compiler/LCNF/ToLCNF.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ where
120120
let type ← replaceExprFVars param.type subst (translator := true)
121121
let paramNew ← mkAuxParam type
122122
jpParams := jpParams.push paramNew
123-
subst := subst.insert param.fvarId (Expr.fvar paramNew.fvarId)
123+
subst := subst.insert param.fvarId (.fvar paramNew.fvarId)
124124
jpArgs := jpArgs.push (Arg.fvar paramNew.fvarId)
125125
let letDecl ← mkAuxLetDecl (.fvar f jpArgs)
126126
let jpValue := .let letDecl (.jmp jpDecl.fvarId #[.fvar letDecl.fvarId])

0 commit comments

Comments
 (0)