feat: don't eagerly simplify local functions that will be inlined

This commit is contained in:
Leonardo de Moura 2022-08-20 17:03:57 -07:00
parent 571a839416
commit 776a9b0dcb
2 changed files with 45 additions and 34 deletions

View file

@ -204,10 +204,16 @@ def simpAppApp? (e : Expr) : OptionT SimpM Expr := do
markSimplified
return mkAppN f e.getAppArgs
def shouldInlineLocal (localDecl : LocalDecl) : SimpM Bool := do
match (← get).localInfoMap.map.find? localDecl.userName with
def isOnceOrMustInline (binderName : Name) : SimpM Bool := do
match (← get).localInfoMap.map.find? binderName with
| some .once | some .mustInline => return true
| _ => lcnfSizeLe localDecl.value (← read).config.smallThreshold
| _ => return false
def shouldInlineLocal (localDecl : LocalDecl) : SimpM Bool := do
if (← isOnceOrMustInline localDecl.userName) then
return true
else
lcnfSizeLe localDecl.value (← read).config.smallThreshold
structure InlineCandidateInfo where
isLocal : Bool
@ -566,7 +572,12 @@ partial def visitLet (e : Expr) (xs : Array Expr := #[]): SimpM Expr := do
| .letE binderName type value body nonDep =>
let mut value := value.instantiateRev xs
if value.isLambda then
value ← visitLambda value
unless (← isOnceOrMustInline binderName) do
/-
If the local function will be inlined anyway, we don't simplify it here,
we do it after its is inlined and we have information about the actual arguments.
-/
value ← visitLambda value
else if let some value' ← simpValue? value then
if value'.isLet then
let e := mkFlatLet binderName type value' body nonDep

View file

@ -3,43 +3,43 @@
fun x =>
let h.14 := fun x_1 =>
Nat.casesOn x_1
(let _x.86 := Nat.mul x x_1;
let _x.87 := Nat.mul _x.86 x;
let _x.88 := Nat.mul _x.87 x_1;
Nat.mul _x.88 x_1)
(let _x.92 := Nat.mul x x_1;
let _x.93 := Nat.mul _x.92 x;
let _x.94 := Nat.mul _x.93 x_1;
Nat.mul _x.94 x_1)
fun n => Nat.add n x_1;
let _x.15 := 1;
let _x.89 := Nat.add x _x.15;
let _x.19 := h.14 _x.89;
let _x.95 := Nat.add x _x.15;
let _x.19 := h.14 _x.95;
let _x.20 := 2;
let _x.90 := Nat.add x _x.20;
let _x.24 := h.14 _x.90;
let _x.91 := Nat.add _x.19 _x.24;
let _x.96 := Nat.add x _x.20;
let _x.24 := h.14 _x.96;
let _x.97 := Nat.add _x.19 _x.24;
let _x.26 := 3;
let _x.92 := Nat.add x _x.26;
let _x.30 := h.14 _x.92;
let _x.93 := Nat.add _x.91 _x.30;
let _x.98 := Nat.add x _x.26;
let _x.30 := h.14 _x.98;
let _x.99 := Nat.add _x.97 _x.30;
let _x.32 := 4;
let _x.94 := Nat.add x _x.32;
let _x.36 := h.14 _x.94;
let _x.95 := Nat.add _x.93 _x.36;
let _x.100 := Nat.add x _x.32;
let _x.36 := h.14 _x.100;
let _x.101 := Nat.add _x.99 _x.36;
let _x.38 := 5;
let _x.96 := Nat.add x _x.38;
let _x.42 := h.14 _x.96;
let _x.97 := Nat.add _x.95 _x.42;
let _x.102 := Nat.add x _x.38;
let _x.42 := h.14 _x.102;
let _x.103 := Nat.add _x.101 _x.42;
let _x.44 := 6;
let _x.98 := Nat.add x _x.44;
let _x.48 := h.14 _x.98;
let _x.99 := Nat.add _x.97 _x.48;
let _x.104 := Nat.add x _x.44;
let _x.48 := h.14 _x.104;
let _x.105 := Nat.add _x.103 _x.48;
let _x.50 := 7;
let _x.100 := Nat.add x _x.50;
let _x.54 := h.14 _x.100;
let _x.101 := Nat.add _x.99 _x.54;
let _x.106 := Nat.add x _x.50;
let _x.54 := h.14 _x.106;
let _x.107 := Nat.add _x.105 _x.54;
let _x.56 := 8;
let _x.102 := Nat.add x _x.56;
let _x.60 := h.14 _x.102;
let _x.103 := Nat.add _x.101 _x.60;
let _x.108 := Nat.add x _x.56;
let _x.60 := h.14 _x.108;
let _x.109 := Nat.add _x.107 _x.60;
let _x.62 := 9;
let _x.104 := Nat.add x _x.62;
let _x.66 := h.14 _x.104;
Nat.add _x.103 _x.66
let _x.110 := Nat.add x _x.62;
let _x.66 := h.14 _x.110;
Nat.add _x.109 _x.66