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:
Henrik Böving 2025-10-30 17:02:45 +01:00 committed by GitHub
parent c0ad969b14
commit 8b28467655
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 23 additions and 2 deletions

View file

@ -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

View 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