perf: better detection of repeated branching on same value (#11020)
This PR improves the detection of situations where we branch multiple times on the same value in the code generator. Previously this would only consider repeated branching on function arguments, now on arbitrary values. Closes: #11018
This commit is contained in:
parent
c0ad969b14
commit
8b28467655
2 changed files with 23 additions and 2 deletions
|
|
@ -61,8 +61,7 @@ def findCtor? (fvarId : FVarId) : DiscrM (Option CtorInfo) := do
|
|||
| some { value := .const declName _ args, .. } =>
|
||||
let some (.ctorInfo val) := (← getEnv).find? declName | return none
|
||||
return some <| .ctor val args
|
||||
| some _ => return none
|
||||
| none => return (← read).discrCtorMap.get? fvarId
|
||||
| _ => return (← read).discrCtorMap.get? fvarId
|
||||
|
||||
def findCtorName? (fvarId : FVarId) : DiscrM (Option Name) := do
|
||||
let some ctorInfo ← findCtor? fvarId | return none
|
||||
|
|
|
|||
22
tests/lean/run/double_match.lean
Normal file
22
tests/lean/run/double_match.lean
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/--
|
||||
trace: [Compiler.saveMono] size: 6
|
||||
def foo f x : Option Nat :=
|
||||
let _x.1 := f x;
|
||||
cases _x.1 : Option Nat
|
||||
| Option.none =>
|
||||
return _x.1
|
||||
| Option.some val.2 =>
|
||||
let _x.3 := Nat.add val.2 val.2;
|
||||
let _x.4 := some ◾ _x.3;
|
||||
return _x.4
|
||||
-/
|
||||
#guard_msgs in
|
||||
set_option trace.Compiler.saveMono true in
|
||||
def foo (f : Nat → Option Nat) (x : Nat) : Option Nat :=
|
||||
if let some val := f x then
|
||||
if let some val2 := f x then
|
||||
some <| val + val2
|
||||
else
|
||||
none
|
||||
else
|
||||
none
|
||||
Loading…
Add table
Reference in a new issue