Skip to content

Commit 09ac400

Browse files
authored
rewrite SizeOfValueInfo in Optimizer.fs to be tail-recursive (#16559)
* rewrite SizeOfValueInfo in Optimizer.fs to be tail-recursive * use Brians rewrite into one local function
1 parent 1112c11 commit 09ac400

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

src/Compiler/Optimize/Optimizer.fs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -230,20 +230,23 @@ type Summary<'Info> =
230230
// Note, this is a different notion of "size" to the one used for inlining heuristics
231231
//-------------------------------------------------------------------------
232232

233-
let rec SizeOfValueInfos (arr:_[]) =
234-
if arr.Length <= 0 then 0 else max 0 (SizeOfValueInfo arr[0])
235-
236-
and SizeOfValueInfo x =
237-
match x with
238-
| SizeValue (vdepth, _v) -> vdepth // terminate recursion at CACHED size nodes
239-
| ConstValue (_x, _) -> 1
240-
| UnknownValue -> 1
241-
| ValValue (_vr, vinfo) -> SizeOfValueInfo vinfo + 1
242-
| TupleValue vinfos
243-
| RecdValue (_, vinfos)
244-
| UnionCaseValue (_, vinfos) -> 1 + SizeOfValueInfos vinfos
245-
| CurriedLambdaValue _ -> 1
246-
| ConstExprValue (_size, _) -> 1
233+
let SizeOfValueInfo valueInfo =
234+
let rec loop acc valueInfo =
235+
match valueInfo with
236+
| SizeValue (vdepth, _v) -> assert (vdepth >= 0); acc + vdepth // terminate recursion at CACHED size nodes
237+
| CurriedLambdaValue _
238+
| ConstExprValue _
239+
| ConstValue _
240+
| UnknownValue -> acc + 1
241+
| TupleValue vinfos
242+
| RecdValue (_, vinfos)
243+
| UnionCaseValue (_, vinfos) when vinfos.Length = 0 -> acc + 1
244+
| TupleValue vinfos
245+
| RecdValue (_, vinfos)
246+
| UnionCaseValue (_, vinfos) -> loop (acc + 1) vinfos[0]
247+
| ValValue (_vr, vinfo) -> loop (acc + 1) vinfo
248+
249+
loop 0 valueInfo
247250

248251
let [<Literal>] minDepthForASizeNode = 5 // for small vinfos do not record size info, save space
249252

0 commit comments

Comments
 (0)